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 Package ProtectionLevel プロパティを ServerStorage に変更します。 この設定は、パッケージを SQL Server データベースに格納し、SQL Server データベース ロールを介したアクセス制御を可能にします。方法 3: SSIS パッケージ
ProtectionLevel
プロパティをEncryptSensitiveWithPassword
に設定します。 SSIS パッケージProtectionLevel
プロパティをEncryptSensitiveWithPassword
に変更します。 この設定では、暗号化にパスワードを使用します。 その後、SQL Server エージェント ジョブ ステップのコマンド ラインを変更して、このパスワードを含めることができます。方法 4: SSIS パッケージ構成ファイルを使用します。 SSIS パッケージ構成ファイルを使用して機密情報を格納し、これらの構成ファイルをセキュリティで保護されたフォルダーに格納します。 その後、パッケージが暗号化されず、シークレットをパッケージに保存しないように、
ProtectionLevel
プロパティをDontSaveSensitive
に変更できます。 SSIS パッケージを実行すると、必要な情報が構成ファイルから読み込まれます。 機密情報が含まれている場合は、構成ファイルが適切に保護されていることを確認します。方法 5: パッケージ テンプレートを作成します。 長期的な解決のために、既定の設定とは異なる保護レベルを使用するパッケージ テンプレートを作成します。 この問題は、今後のパッケージでは発生しません。
問題を再現する手順
- SQLServerSQLAgentUser グループに含まれていないユーザーとしてログインします。 たとえば、ローカル ユーザーを作成できます。
- SSIS パッケージを作成し、ExecuteSQL タスクを追加します。 次の文字列を使用して、ローカル msdb ファイルへの OLE DB 接続マネージャーを使用します:
'Windows Authentication' -SQLSourceType: "Direct Input" -SQLStatement: "sp_who"
。 - パッケージを実行して、正常に実行されていることを確認します。
ProtectionLevel
プロパティがEncryptSensitiveWithPassword
に設定されている。- SQL Server エージェント ジョブとジョブ ステップを作成します。 実行の一覧で、SQL Server エージェントサービスをクリックしてジョブ ステップを実行します。 SQL Server エージェントジョブ履歴のテキストには、次のような情報が表示されます。
パッケージ シークレットの暗号化を解除する
SSIS パッケージ ProtectionLevel
プロパティの既定の設定は EncryptSensitiveWithUserKey
。 パッケージが保存されると、SSIS は、パスワード、ユーザー名、接続文字列など、sensitive
としてマークされているプロパティを含むパッケージの部分のみを暗号化します。 そのため、パッケージを再読み込みするときに、現在のユーザーは、復号化する sensitive
プロパティの暗号化要件を満たす必要があります。 ただし、現在のユーザーは、パッケージを読み込むのに暗号化要件を満たす必要はありません。 SQL Server エージェント ジョブ ステップを使用してパッケージを実行する場合、既定のアカウントは SQL Server エージェント サービス アカウントです。 この既定のアカウントは、パッケージ作成者とは異なるユーザーである可能性が高いです。 そのため、SQL Server エージェント ジョブ ステップはジョブ ステップを読み込んで実行を開始できますが、接続を完了できないため、パッケージは失敗します。 たとえば、パッケージは OLE DB 接続または FTP 接続を完了できません。 接続する必要がある資格情報を復号化できないため、パッケージは失敗します。
重要
開発プロセスと環境を検討して、各コンピューターで必要なアカウントと使用されるアカウントを決定します。 ProtectionLevel
プロパティの EncryptSensitiveWithUserKey 設定は、強力な設定です。 この設定は、最初はデプロイの複雑さを引き起こすので、割引を受けてはなりません。 適切なアカウントにログインするときに、パッケージを暗号化できます。 Dtutil.exe SSIS コマンド プロンプト ユーティリティを使用して、.cmd ファイルと SQL Server エージェント コマンド サブシステムを使用して保護レベルを変更することもできます。 たとえば、次の手順に従います。 Dtutil.exe ユーティリティはバッチ ファイルとループで使用できるため、複数のパッケージに対してこれらの手順を同時に実行できます。
パスワードを使用して暗号化するパッケージを変更します。
ProtectionLevel
プロパティをEncryptSensitiveWithUserKey
に変更するには、Operating System (cmd Exec) SQL Server エージェント ジョブ ステップを使用して、Dtutil.exe ユーティリティを使用します。 このプロセスでは、パスワードを使用してパッケージの暗号化を解除してから、パッケージを再暗号化します。 パッケージの暗号化に使用されるユーザー キーは、Run As リストのSQL Server エージェント ジョブ ステップの設定です。Note
キーにはユーザー名とコンピューター名が含まれているため、パッケージを別のコンピューターに移動する効果が制限される場合があります。
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 2005 Integration Services パッケージを SQL Server 2005 で実行しようとすると、"読み込みエラー" というエラー メッセージが表示される方法に関するページを参照してください。
バッチ操作で Dtutil.exe ユーティリティを使用する方法の詳細については、「 dtutil ユーティリティ (Dtutil.exe) を使用して SQL Server 2005 の SQL Server Integration Services (SSIS) パッケージのバッチの保護レベルを設定する方法」を参照してください。
パッケージ テンプレートを作成する方法の詳細については、「 SQL Server Business Intelligence Development Studio でパッケージ テンプレートを作成する方法」を参照してください。
SSIS パッケージのセキュリティと
ProtectionLevel
プロパティの詳細については、SQL Server 2005 オンライン ブックの「Integration Services の セキュリティに関する考慮事項 」トピックを参照してください。
残念ながら、ユーザーは、既定のエージェント ジョブ ステップ設定によってこの状態に設定されていることに気付いていません。 SQL Server エージェント プロキシと SSIS の詳細については、SQL Server 2005 オンライン ブックの次のトピックを参照してください。
- SQL Server エージェントでのパッケージ実行のスケジュール設定
- SQL Server エージェント プロキシの作成