3つのSQL Server 2012インスタンスがありますが、そのうちの2つはdb_owner
ではありません。一部のストアドプロシージャは、DMVおよびsys
ビューと、ローカルで実行した場合にのみ機能するストアドプロシージャを使用しています。
これらの(私たちの)ストアドプロシージャの実行をメインインスタンスに集中化し、そこからこれらのストアドプロシージャをリモートで実行したいと思います。 SQL Serverエージェントのジョブを使用してみましたが、実行に慣れていない構成が必要で、おそらくアクセスできません。
リンクサーバーを使用して、ストアドプロシージャをリモートで実行する方法はありますか?
編集:リンクサーバーopenrowset
、シンプルなSQL内で実行できるものなら何でも使用できます。 SSISを使用しないでください。使用すると、プロセスの一部が単純なSQLから分離され、それを実行するには複数のプラットフォームが必要になります。
プロシージャがリモートサーバー上にあると仮定します。EXECUTEATコマンドを使用してみましたか?
DECLARE @RunStoredProcSQL VARCHAR(1000);
SET @RunStoredProcSQL = 'EXEC [Database].[dbo].[StoredProcName]';
--SELECT @RunStoredProcSQL --Debug
EXEC (@RunStoredProcSQL) AT [LinkedServerName];
Print 'Procedure Executed';
それは私が過去にうまく使用したものです。私は通常、念のため、declare/execをtry catchで囲みますが、現在私のシステムでは1時間ごとに動作しています。
SSISの仕事のように聞こえます。 SSISパッケージをセットアップし、Execute SQL Task
ストアドプロシージャを実行します。その後、エージェントジョブを介してSSISパッケージを実行できます。
「リンクサーバーでプロシージャを実行」を検索すると、このスレッドが見つかりました。しかし、私の要件は、複数のサーバーで利用できる同じ手順を実行することであり、私はあなたや他のユーザーを助けることができる以下を思いついた:
より簡単な方法で質問に答えるには、4つの部分からなる名前を使用してリモートクエリを実行します:Exec ('linkedservername.DBName.dbo.ProcedureName') ;
次のクエリを使用して、中央サーバー(このスクリプトの実行元)で使用可能な複数のリンクサーバーを対象とするリンクサーバー(1つに限定されない)でプロシージャを実行できます。
Declare @TargetServers table (LinkedServer nvarchar(50));
Declare @LinkedServer varchar(50);
Insert into @TargetServers
select [data_source] from sys.servers where is_linked = 1 and [Provider] = 'SQLNCLI';
While exists (select * from @TargetServers)
begin
set @LinkedServer = (select top 1 name from sys.servers where is_linked = 1);
Exec ('['+@LinkedServer + '].DBAClient.dbo.ProcessUnusedIndexInfo') ;
if @@ERROR = 0
delete from @TargetServers where LinkedServer = @LinkedServer;
end