2009-07-09 8 views
0

スクリプト化されたプロシージャの一部として、をプログラムで実装しようとしていますストアドプロシージャ内のリンクサーバーへの参照を更新しました。私たちはこのようにいくつかの参照を持っている: - :私はいくつかのデータベース間でスクリプトをで完全にプログラム的にこれを行う「火と忘れる」したいSQL Serverストアドprocs内のローカルデータベース参照で、プログラムでリンクされたサーバー参照を置換しますか?

SELECT foo, bar 
FROM [Database].dbo.[Table] 

- に

SELECT foo, bar 
FROM [Server].[Database].dbo.[Table] 

はどの私が翻訳したいです。

メタデータを使用してリンクテーブルへの参照を検索し、メタデータから各spのテキストを再度読み込み、各SPのテキストを調整し、更新されたテキストの各ブロックをexec文にして、 1つ1つ

私はこれが大きな痛みになるかどうか疑問に思っています。だから誰にも良いアイデアはありますか?私はそれがよりよい解決策を提供できるならば、powershellを使うことにオープンしています。

ありがとうございます!

+0

fyi: 'sqlserver *'タグの名前がサイトワイドに変更されました。今後は 'sql-server'を使用してください。 –

+0

ああありがとう。 – ljs

答えて

1

うまくいけば、私が質問を理解していますが、むしろ、[サーバー]を削除または交換するよりも、私は2つの方法のいずれかをお勧め:

  • オプション1: のSPのいずれかを変更しないでくださいを。代わりに、リンク サーバー構成を更新して 異なるデータベース(ローカルの の場合でも)を指すようにします。

  • オプション2: SPのいずれも変更しないでください。代わりに、SQL Server エイリアスを使用して開始します。 SQL Serverの別名は で、CliConfigユーティリティで管理され、 は最終的に レジストリに格納されます。したがって、手動でまたは.regスクリプトを介して を適用することができます。 基本的に、SQL Serverエイリアス は、参照されているサーバー( ポートとともに)を解読します。 リンクサーバー の構成を更新して、特定の サーバーではなくSQL サーバーエイリアスを参照する場合は、 の場合は、手順 を別のサーバー(ローカルサーバーも)に指定できます。

私はそれが役に立ちそうです。

+0

ローカルボックスをポイントするようにリンクサーバーを更新する際の問題(この場合必要です)は、ループバックリンクサーバーに問題があることです主に、リンクされたサーバーからの読み込みと同じクエリでデータを書き込むことで、何かする必要があります。 SQL Serverはリンクサーバー(afaik)のエイリアスを確認しないので、エイリアスはそれを修正しません。 – ljs

1

あなたのアプローチは、率直で、率直にです。今年も同様の問題が発生しました

  • sysを読んでください。sql_modules
  • は、リンクサーバーのテキストを置換し、CREATE - > ALTER
  • ここEXEC(@Result)
1

は、SQL 2005のインスタンス上のリンクサーバーを参照するすべてのprocs /機能/ビューを見つけるためのスクリプトです - かもしれませんこれは、本番環境のために良いアイデアであることを行っていない

 
USE master 
GO 
SET NOCOUNT ON; 

-------------------------------------------------------------------- 
-- Test linked server connections 
-------------------------------------------------------------------- 
BEGIN TRY DROP TABLE #Svrs; END TRY BEGIN CATCH END CATCH; 

CREATE TABLE #Svrs 
(
    [Server]    nvarchar(max), 
    [CanConnectAsDefault] bit 
); 

DECLARE @ServerName nvarchar(max), @RetVal int; 

DECLARE Svrs CURSOR FAST_FORWARD READ_ONLY 
FOR 
    SELECT ServerName = S.name 
    FROM sys.servers S; 

OPEN Svrs; 
FETCH NEXT FROM Svrs INTO @ServerName; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    BEGIN TRY 
     EXEC @RetVal = sys.sp_testlinkedserver @ServerName; 
    END TRY 
    BEGIN CATCH 
     SET @RetVal = sign(@@error); 
    END CATCH; 

    INSERT INTO #Svrs 
    SELECT @ServerName 
     , CASE WHEN @RetVal = 0 THEN 1 ELSE 0 END; 

    FETCH NEXT FROM Svrs INTO @ServerName; 
END; 
CLOSE Svrs; 
DEALLOCATE Svrs; 

SELECT * FROM #Svrs 
DROP TABLE #Svrs; 
GO 

-------------------------------------------------------------------- 
-- Report linked server references 
-------------------------------------------------------------------- 
BEGIN TRY DROP TABLE #Refs; END TRY BEGIN CATCH END CATCH; 

CREATE TABLE #Refs 
(
    [Server] nvarchar(max), 
    [Database] nvarchar(max), 
    [Schema] nvarchar(max), 
    [Object] nvarchar(max), 
    [Type]  nvarchar(max) 
); 

DECLARE @DatabaseName nvarchar(max), @ServerName nvarchar(max), @SQL nvarchar(max); 
DECLARE Refs CURSOR FAST_FORWARD READ_ONLY 
FOR 
    SELECT DatabaseName = D.name 
     , ServerName = S.name 
    -- , ServerProvider = S.provider 
    -- , ServerSource = S.data_source 
    FROM sys.databases D 
      CROSS JOIN sys.servers S 
    WHERE D.name NOT IN ('master', 'tempdb', 'model', 'msdb', 'ReportServer', 'ReportServerTempDB'); 

OPEN Refs; 
FETCH NEXT FROM Refs INTO @DatabaseName, @ServerName; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @SQL = 'USE [' + @DatabaseName + '];     
       INSERT INTO #Refs 
       SELECT DISTINCT ''' + @ServerName + ''', ''' + @DatabaseName + ''', S.[name], O.[name], O.type_desc 
       FROM syscomments C 
         INNER JOIN sys.objects O ON C.id = O.[object_id] 
         LEFT JOIN sys.schemas S ON S.[schema_id] = O.[schema_id] 
       WHERE C.[TEXT] LIKE ''%[ ,~[('''']' + @ServerName + '[ .,~])'''' ]%'' ESCAPE ''~'';' 

    PRINT 'Looking for ' + @ServerName + ' refs in ' + @DatabaseName -- + ': ' + @SQL; 

    EXEC sp_executesql @SQL; 

    FETCH NEXT FROM Refs INTO @DatabaseName, @ServerName; 
END 
CLOSE Refs; 
DEALLOCATE Refs; 

SELECT * FROM #Refs 
DROP TABLE #Refs; 
GO 

-------------------------------------------------------------------- 
SET NOCOUNT OFF; 
GO 
1

ていますが、devの目的のためにループバックリンクサーバーを必要とする場合thisは私のために働いた:あまりにも役立つこと

EXEC sp_addlinkedserver @server = N'name_for_linked_server', 
    @srvproduct = N' ', 
    @provider = N'SQLNCLI', 
    @datasrc = N'name_of_my_sqlserver_instance', 
    @catalog = N'name_of_database' 
関連する問題