2016-11-03 25 views
14

スクリプトタスクを実行するSSISパッケージがあります(主に、その他いくつかのものがあります)。スクリプトタスクは、OleDB接続を使用してAccessデータベースに接続します。これは、Microsoft Jet 4.0接続です。私はドライバがインストールされている。しかし、プロキシアカウント経由でSQLエージェントで実行されることはありません。 Visual Studioとパッケージストアから直接正常に実行されます。実際、プロキシが結びついている特別なアカウントとしてログインすると、両方の場所で正常に動作します。しかし、私がSQL Serverエージェントを介して実行すると、恐ろしい "Unspecifed Error" OleDbExceptionが発生します。スクリプトタスクからSSISパッケージでAccessデータベースにSSISパッケージでエラーが発生しました

関連するコード:SQLエージェントのジョブ履歴を経由して

// class field 
private string accessConnectionStringTemplate = "Data Source=\"{0}\";Provider=Microsoft.Jet.OLEDB.4.0;"; 

// in method that connects to database 
Print(file, "Connection string: " + string.Format(accessConnectionStringTemplate, file.FileName)); 
// outputs: Data Source = "\Path\To\File";Provider=Microsoft.Jet.OLEDB.4.0" 
using(access = new OleDbConnection(string.Format(accessConnectionStringTemplate, file.FileName))) { 
    access.Open(); 
    // other code 
} 

エラーメッセージ:

  • アクセス:

    Started: 12:35:10 PM 
    Error: 2016-11-03 12:35:33.51 
        Code: 0x00000000 
        Source: Import Files Main 
        Description: Exception: Unspecified error 
    End Error 
    Error: 2016-11-03 12:35:33.51 
        Code: 0x00000000 
        Source: Import Files Main 
        Description: at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) 
        at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) 
        at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) 
        at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions) 
        at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) 
        at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
        at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
        at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
        at System.Data.OleDb.OleDbConnection.Open() 
        at ST_cc0028a4b56242909c2eae546a807995.csproj.ScriptMain.ImportFile(AccessFile file, DateTime startRecordDate, DateTime endRecordDate, List`1 accessTables, Boolean includeTransactionTables, List`1 specifiedTableList) 
        at ST_cc0028a4b56242909c2eae546a807995.csproj.ScriptMain.Main() 
    End Error 
    Error: 2016-11-03 12:35:33.51 
        Code: 0x00000006 
        Source: Import Files 
        Description: The script returned a failure result. 
    End Error 
    

    いくつかのものは、私は確かで作られてきましたドライバがインストールされ、SQL Agentがオンになっているサーバー上で動作します。私はVSでパッケージを私のアカウントとプロキシのアカウントの両方で問題なく実行することでこれを確認しました。

  • プロキシアカウントは問題のファイルにアクセスできます。再度、サーバーにプロキシのアカウントとしてログインして確認します。ファイルはネットワーク共有にありますが、パスはUNCパスとして指定されています。
  • プロキシアカウントは、この操作の一部である他のデータベースにアクセスし、他の潜在的なエラーの原因を排除します。
  • パッケージストアからSSMS経由でパッケージを実行すると、自分のアカウントとプロキシのアカウントの両方が機能します。私はデータベースサーバー上でこれを確認しました。

私はこれについてインターネットで見たことがあります。これは通常、ドライバの問題です。この場合、私はそれがどうなるかは分かりません。

他の診断に役立つ追加情報を提供していただきありがとうございます。なぜ私はこれがうまくいかないのか全く分かりません。

+0

奇数、ファイルが開かれているか、ロックされていますか? – Siyual

+1

@Siyual:そうではありません。私はSQL Agentの外で実行することができるので、それは問題ではないようです。私はエージェントの仕事を実行しているときに誰かがそれを開いている可能性が高いと思います。 – siride

+0

うん、ここには言葉があります。名目上、接続文字列の引数はセミコロンで区切られていて、引数の前後に引用符がついていません。引用符を取り出してみてください。それはキッカーだろうか? – Clay

答えて

6

それは問題はJetプロバイダは、タスクが別のユーザーとして偽装して実行されていたにもかかわらず、SQL Agentユーザーの一時ディレクトリに書き込みをしようとしていたということであったことが判明。これは、Windowsの偽装システムの機能のように見えますが、ユーザープロファイルは変更されず、ユーザートークンのみが変更されます。私はこのコードで終わった:

var tempPath = Path.GetTempPath().Replace("\\SQLSERVERAGENT\\", "\\" + Environment.UserName + "\\"); 
Environment.SetEnvironmentVariable("TEMP", tempPath); 
Environment.SetEnvironmentVariable("TMP", tempPath); 

それは理想的ではありませんが動作します。つまり、SQL Agentの一時ディレクトリにアクセス権を与える必要はありません。このコードだけを変更する必要があります。

悲しいことに、ODBCドライバが一時ファイルを置く場所を変更する方法はないようです。

EDIT:Excelソースを使用した通常のデータフローベースのパッケージでもこの問題が発生しました。その場合、私はプロキシユーザーのアカウントのSQLエージェントの一時ディレクトリへのアクセスを許可する以外に選択肢はありませんでした。もし私もそこに回避策を考え出すことができるなら、私はそれを掲示するでしょう。

1

私はいくつかのことを試してみることをお勧め:

  1. は、すなわち(32ビットと64ビットの両方のオプションを使用して)SQLエージェントからdtexce.exe構文を使用してCMDモードを使用してパッケージを実行するようにしてください。

  2. サービスアカウント(SQLエージェントの実行中のアカウント)をDCOM component for Integration Serviceに追加します。許可されている場合は、SQLエージェントサービスアカウントをプロキシアカウント(テスト用)に変更します。

  3. プロキシアカウントを使用してすべてを実行します。つまり、プロキシアカウントを使用してパッケージを展開し、ジョブの所有者をプロキシアカウント(SQLエージェント内)にします。プロキシアカウントを使用してジョブを作成します。

  4. プロキシアカウントまたはSQLエージェントサービスアカウントに関連するエラーがある場合は、ウィンドウevent viewerを確認してください。

  5. SQL Server 2012以降を使用している場合は、パッケージを展開して、Integration Servicesカタログを使用してください。

+0

パッケージが実行中で、他の処理を行っていますが、このAccessデータベースへの接続を中間ステップの1つとして開くことができません。私はこれらのことのいくつかをやってみることができますが、私の問題とはほとんど関係がないようです。 – siride

+0

あなたのパッケージはSQLエージェントジョブからのみ失敗しています。したがって、アクセス許可/アクセスのようなSQLエージェントサービスアカウントの設定に焦点を当てている可能性があります。プロキシアカウントでの問題のようには見えません(あなたの説明に従って)。 – p2k

+0

私は決して使用していないSQL Agentサービスアカウントではなく、プロキシアカウントとして(おそらく)実行しています。 – siride

関連する問題