SQL Server 2005 インスタンス (ローカル サーバー) から 150 を超える SQL Server インスタンス (SQL Server 2000、リモート) でジョブを手動で実行する必要があります。ジョブは、これらすべてのインスタンスで同じです。ジョブは、パラメーターなしでストアド プロシージャを呼び出すだけで、これもすべてのインスタンスで同じです。これらのジョブはスケジュールに従っています。しかし今では、リクエストに応じて、すべてのインスタンスまたは指定されたインスタンスに対してジョブを手動で実行するよう求められています。
これのベストプラクティスは何ですか? リモート ストアド プロシージャを呼び出すために openrowset を試しました。しかし、ジョブの各実行には数分かかるため、ループを使用してこれらすべてのジョブを実行すると、1 つずつ実行され、長い時間がかかります。理想的には、終了を待たずに各インスタンスでストアド プロシージャを実行できる必要があります。より理想的には、ジョブが終了するのを待たずに各インスタンスでジョブを実行できる必要があるため、各インスタンスのジョブ履歴に記録を残すことができます。
また、ストアド プロシージャはサード パーティ製であるため、変更することはできません。
アップデート:
「人々」はこれを SSRS レポートから初期化するように要求するため、SSRS を使用してサーバー上の T-SQL/proc を呼び出すことが最も適切です。私が今得た問題は、OPENQUERY または OPENROWSET を使用してローカル サーバーからリモート SQL Server 2000 インスタンスで msdb.dbo.sp_start_job を呼び出すときに、次のエラーが発生したことです。
オブジェクト「exec msdb.dbo.sp_start_job @job_name = 'xxx'」を処理します。リンク サーバー "xxx" の OLE DB プロバイダ "SQLNCLI" は、オブジェクトに列がないか、現在のユーザーがそのオブジェクトに対するアクセス許可を持っていないことを示しています。
OPENQUERY/OPENROWSET を使用して他のリモート プロシージャを問題なく呼び出すことができるため、sp_start_job が何も返さないことが原因である可能性があります。それで、回避策はありますか?
アップデート:
t-sql では、実際にはかなり単純であることがわかりました。
EXEC [linkedServerName].msdb.dbo.sp_start_job @job_name = 'test2'
したがって、すべてのリモート SQL Server 2000 インスタンスが既にリモート サーバーとして追加されているため、実際に OPENROWSET/OPENQUERY を使用する必要はありません。