SQL Server エージェント ジョブ ステップから呼び出されたときに SSIS パッケージが実行されない

この記事は、SQL Server エージェント ジョブ ステップから SSIS パッケージを呼び出したときに発生する問題を解決するのに役立ちます。

元の製品バージョン: SQL Server
元の KB 番号: 918760

現象

SQL Server エージェント ジョブ ステップから Microsoft SQL Server Integration Services (SSIS) パッケージを呼び出しても、SSIS パッケージは実行されません。 ただし、SSIS パッケージを変更しないと、SQL Server エージェント外で正常に実行されます。

解決方法

この問題を解決するには、以下のいずれかの方法を使用します。 最も適切な方法は、環境とパッケージが失敗した理由によって異なります。 パッケージが失敗した理由は次のとおりです。

  • SQL Server エージェントでパッケージを実行するために使用されるユーザー アカウントは、元のパッケージ作成者とは異なります。
  • ユーザー アカウントには、接続を行ったり、SSIS パッケージの外部のリソースにアクセスしたりするために必要なアクセス許可がありません。

次のシナリオでは、パッケージが実行されない場合があります。

  • 現在のユーザーは、パッケージからシークレットを復号化できません。 このシナリオは、現在のアカウントまたは実行アカウントが元のパッケージ作成者と異なり、パッケージの ProtectionLevel プロパティ設定で現在のユーザーがパッケージ内のシークレットを復号化できない場合に発生する可能性があります。
  • 現在のユーザーに必要なアクセス許可がないため、統合セキュリティを使用するSQL Server接続が失敗します。
  • 現在のユーザーには、接続マネージャーがアクセスするファイル共有に書き込むための必要なアクセス許可がないため、ファイルアクセスが失敗します。 たとえば、このシナリオは、ログインとパスワードを使用しないテキスト ログ プロバイダーで発生する可能性があります。 このシナリオは、SSIS ファイル システム タスクなど、ファイル接続マネージャーに依存するすべてのタスクでも発生する可能性があります。
  • レジストリ ベースの SSIS パッケージ構成では、レジストリ キーが使用されます HKEY_CURRENT_USER 。 レジストリ キーは HKEY_CURRENT_USER ユーザー固有です。
  • タスクまたは接続マネージャーでは、現在のユーザー アカウントに正しいアクセス許可が必要です。

この問題を解決するには、次の方法を使用します。

  • 方法 1: SQL Server エージェント プロキシ アカウントを使用します。 SQL Server エージェント プロキシ アカウントを作成します。 このプロキシ アカウントでは、SQL Server エージェントパッケージを作成したアカウントとして、または必要なアクセス許可を持つアカウントとしてジョブを実行できる資格情報を使用する必要があります。

    このメソッドは、シークレットの暗号化を解除するために機能し、ユーザーによる主要な要件を満たします。 ただし、SSIS パッケージ のユーザー キーには現在のユーザーと現在のコンピューターが含まれているため、この方法では成功が制限される可能性があります。 そのため、パッケージを別のコンピューターに移動した場合、ジョブ ステップで正しいプロキシ アカウントが使用されている場合でも、この方法は失敗する可能性があります。

  • 方法 2: SSIS パッケージ ProtectionLevel プロパティを ServerStorage に設定します。 SSIS パッケージ ProtectionLevel プロパティを ServerStorage に変更します。 この設定は、パッケージをSQL Server データベースに格納し、SQL Server データベース ロールを介したアクセス制御を可能にします。

  • 方法 3: SSIS パッケージ ProtectionLevel プロパティを に EncryptSensitiveWithPassword設定します。 SSIS パッケージ ProtectionLevel プロパティを に変更します EncryptSensitiveWithPassword。 この設定では、暗号化にパスワードを使用します。 その後、SQL Server エージェント ジョブ ステップのコマンド ラインを変更して、このパスワードを含めることができます。

  • 方法 4: SSIS パッケージ構成ファイルを使用します。 SSIS パッケージ構成ファイルを使用して機密情報を格納し、これらの構成ファイルをセキュリティで保護されたフォルダーに格納します。 その後、 プロパティを ProtectionLevelDontSaveSensitive 変更して、パッケージが暗号化されず、シークレットをパッケージに保存しないようにすることができます。 SSIS パッケージを実行すると、必要な情報が構成ファイルから読み込まれます。 機密情報が含まれている場合は、構成ファイルが適切に保護されていることを確認します。

  • 方法 5: パッケージ テンプレートを作成します。 長期的な解決のために、既定の設定とは異なる保護レベルを使用するパッケージ テンプレートを作成します。 この問題は、今後のパッケージでは発生しません。

問題の再現手順

  1. SQLServerSQLAgentUser グループに属していないユーザーとしてログインします。 たとえば、ローカル ユーザーを作成できます。
  2. SSIS パッケージを作成し、ExecuteSQL タスクを追加します。 次の文字列を使用して、ローカル msdb ファイルへの OLE DB 接続マネージャーを使用します 'Windows Authentication' -SQLSourceType: "Direct Input" -SQLStatement: "sp_who"
  3. パッケージを実行して、正常に実行されていることを確認します。
  4. ProtectionLevel プロパティは EncryptSensitiveWithPassword に設定されています。
  5. SQL Server エージェント ジョブとジョブ ステップを作成します。 [実行] ボックスの一覧で、[SQL Server エージェント サービス] をクリックしてジョブ ステップを実行します。 SQL Server エージェントジョブ履歴のテキストには、次のような情報が表示されます。

パッケージ シークレットの暗号化を解除する

SSIS パッケージ ProtectionLevel プロパティの既定の設定は です EncryptSensitiveWithUserKey。 パッケージを保存すると、SSIS は、パスワード、ユーザー名、接続文字列など、マーク sensitiveされたプロパティを含むパッケージの部分のみを暗号化します。 そのため、パッケージが再読み込みされるときに、現在のユーザーは、復号化するプロパティの暗号化要件を sensitive 満たす必要があります。 ただし、現在のユーザーは、パッケージを読み込むための暗号化要件を満たす必要はありません。 SQL Server エージェント ジョブ ステップを使用してパッケージを実行する場合、既定のアカウントは SQL Server エージェント サービス アカウントです。 この既定のアカウントは、パッケージ作成者とは異なるユーザーである可能性が最も高いです。 そのため、SQL Server エージェント ジョブ ステップはジョブ ステップを読み込んで実行を開始できますが、接続を完了できないため、パッケージは失敗します。 たとえば、パッケージは OLE DB 接続または FTP 接続を完了できません。 接続する必要がある資格情報を復号化できないため、パッケージは失敗します。

重要

開発プロセスと環境を検討して、各コンピューターで必要なアカウントと使用するアカウントを決定します。 プロパティの EncryptSensitiveWithUserKey 設定 ProtectionLevel は強力な設定です。 この設定は、最初はデプロイの問題を引き起こすため、割引を適用しないでください。 パッケージは、適切なアカウントにログインするときに暗号化できます。 Dtutil.exe SSIS コマンド プロンプト ユーティリティを使用して、.cmd ファイルとSQL Server エージェント コマンド サブシステムを使用して保護レベルを変更することもできます。 たとえば、次の手順に従います。 バッチ ファイルとループで Dtutil.exe ユーティリティを使用できるため、複数のパッケージに対してこれらの手順を同時に実行できます。

  1. パスワードを使用して暗号化するパッケージを変更します。

  2. オペレーティング システム (cmd Exec) SQL Server エージェント ジョブ ステップを使用して Dtutil.exe ユーティリティを使用して、 プロパティを ProtectionLevelEncryptSensitiveWithUserKey変更します。 このプロセスでは、パスワードを使用してパッケージの暗号化を解除してから、パッケージを再暗号化します。 パッケージの暗号化に使用されるユーザー キーは、実行リストのSQL Server エージェント ジョブ ステップ設定です。

    注:

    キーにはユーザー名とコンピューター名が含まれているため、パッケージを別のコンピューターに移動する効果が制限される場合があります。

SSIS パッケージのエラーに関する詳細なエラー情報があることを確認します

SQL Server エージェント ジョブ履歴の限られた詳細に依存する代わりに、SSIS ログを使用して、SSIS パッケージのエラーに関するエラー情報があることを確認できます。 また、SSIS サブシステム コマンドの代わりに exec サブシステム コマンドを使用してパッケージを実行することもできます。

SSIS ログについて

SSIS ログとログ プロバイダーを使用すると、パッケージの実行と失敗に関する詳細をキャプチャできます。 既定では、パッケージは情報をログに記録しません。 情報をログに記録するようにパッケージを構成する必要があります。 情報をログに記録するようにパッケージを構成すると、次のような詳細情報が表示されます。 この場合、アクセス許可の問題であることがわかります。

OnError,DOMAINNAME,DOMAINNAME\USERNAME,FTP Task,{C73DE41C-D0A6-450A-BB94-DF6D913797A1},{2F0AF5AF-2FFD-4928-88EE-1B58EB431D74},4/28/2006 1:51:59 PM,4/28/2006 1:51:59 PM,-1073573489,0x,Unable to connect to FTP server using "FTP Connection Manager".
OnError,DOMAINNAME,DOMAINNAME\USERNAME,Execute SQL Task,{C6C7286D-57D4-4490-B12D-AC9867AE5762},{F5761A49-F2F9-4575-9E2B-B3D381D6E1F3},4/28/2006 4:07:00 PM,4/28/2006 4:07:00 PM,-1073573396,0x,Failed to acquire connection "user01.msdb". Connection may not be configured correctly or you may not have the right permissions on this connection.

exec サブシステムのコマンドと出力情報について

exec サブシステム コマンド アプローチを使用して、詳細なコンソール ログ 記録スイッチを SSIS コマンド ラインに追加して、Dtexec.exe SSIS コマンド ライン実行可能ファイルを呼び出します。 さらに、出力ファイルの高度なジョブ機能を使用します。 [履歴にステップ出力を含める] オプションを使用して、ログ情報をファイルまたはジョブ履歴SQL Server エージェントにリダイレクトすることもできます。

コマンド ラインの例を次に示します。

 dtexec.exe /FILE "C:\_work\SSISPackages\ProtectionLevelTest\ProtectionLevelTest\AgentTesting.dtsx" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF /REPORTING V /CONSOLELOG NCOSGXMT

コンソール ログは、次のような詳細を返します。

Error: 2006-04-27 18:13:34.76 Code: 0xC0202009 Source: AgentTesting Connection manager "(local).msdb" Description: An OLE DB error has occurred. Error code: 0x80040E4D. An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80040E4D Description: "Login failed for user 'DOMAINNAME\username'.". End Error
Error: 2006-04-28 13:51:59.19 Code: 0xC0016016 Source: Description: Failed to decrypt protected XML node "DTS:Property" with error 0x80070002 "The system cannot find the file specified.". You may not be authorized to access this information. This error occurs when there is a cryptographic error. Verify that the correct key is available. End Error
Log: Name: OnError Computer: COMPUTERNAME Operator: DOMAINNAME\username Source Name: Execute SQL Task Source GUID: {C6C7286D-57D4-4490-B12D-AC9867AE5762} Execution GUID: {7AFE3D9E-5F73-42F0-86FE-5EFE264119C8} Message: Failed to acquire connection "(local).msdb". Connection may not be configured correctly or you may not have the right permissions on this connection. Start Time: 2006-04-27 18:13:34 End Time: 2006-04-27 18:13:34 End Log

関連情報

残念ながら、ユーザーは、既定のエージェント ジョブ ステップ設定によってこの状態に設定されていることに気付いていません。 SQL Server エージェント プロキシと SSIS の詳細については、SQL Server 2005 オンライン ブックの次のトピックを参照してください。

  • SQL Server エージェントでのパッケージ実行のスケジュール設定
  • SQL Server エージェント プロキシの作成