私は周りを見回して、これを行う方法についていくつかのアイデアを見つけましたが、決定的な最善の方法はありません. アイデアの 1 つは、sp_start_job を使用して、DTS パッケージを実行する SQL Server エージェント ジョブを開始することでした。これが最善の方法である場合、次の質問は、「ジョブから DTS パッケージをスケジュールして、非定期的にするにはどうすればよいですか?」ということになります。
ありがとう、ティム
私は周りを見回して、これを行う方法についていくつかのアイデアを見つけましたが、決定的な最善の方法はありません. アイデアの 1 つは、sp_start_job を使用して、DTS パッケージを実行する SQL Server エージェント ジョブを開始することでした。これが最善の方法である場合、次の質問は、「ジョブから DTS パッケージをスケジュールして、非定期的にするにはどうすればよいですか?」ということになります。
ありがとう、ティム
この種の機能をトリガーに結び付けることはお勧めしません。トリガーは高速である必要があります。私が望んでいるトリガーと同じくらい速く DTS パッケージを起動する方法はないと思います。これに共感する場合は、トリガーで特別なテーブルに行を挿入するだけで、目的に応じて必要な回数 (毎分? 10 秒ごと?) このテーブルを監視するジョブを実行することをお勧めします。必要に応じて適切な DTS パッケージを開始します。
xp_cmdshellを使用すると、dtsrun を実行できます。
xp_cmdshell を使用する代わりに、次のようにしました。
テーブル内の特定の値が変更されると、トリガーは msdb.sp_start_job を使用してジョブを開始します。このジョブは、ユーザーによって開始された場合にのみ、スケジュールに従って実行されるべきではありません。ジョブ スケジュールを 1 回実行するように設定しましたが、これは過去のことです。有効なボックスのチェックを外しました。
このジョブには、DTSRun /~Z0xHEXENCRYPTEDVALUE という 1 つのステップがあります。DTS パッケージは、このサーバーから別のプラットフォーム上の別のサーバーにいくつかの行をコピーし、成功すると次回のトリガーでテーブルの値をリセットします。トリガーは、sp_start_job を呼び出す前にテーブルの値をチェックするため、ジョブは毎回ではなく特定の条件下でのみ開始されます。
sp_start_job は非同期で実行されるため、トリガーはすぐに完了します。これの唯一の欠点は、成功時にリセットされた値をポーリングし、それが機能したことをユーザーに知らせるか、タイムアウト後に機能しなかったことです。
別の方法として、同期操作が必要な場合は xp_cmdshell を使用しますが、これはトリガーの内部からは適切ではない可能性があります。