2016-05-20 1 views
-2

DB1とDB2の2つのデータベースがあるとします。 DB1にはStudentという名前のテーブルがあり、DB2にはSP1という名前のストアドプロシージャがあります。 SP1では、以下のクエリを使用してスチューデントテーブルのデータを選択しています。DB1の要求をDB2にリダイレクトする方法

*をDB1.dbo.Studentから選択します。

上記のクロスデータベース通信を持つストアドプロシージャは300以上あります。今、データベースとデータベースのスキーマの観点から、DB1と同じDB3からDB3に変更したいと考えています。 このために、完全修飾データベース名を持つ300のストアドプロシージャもすべて変更する必要があります。さて、クエリは、おそらく次のようになります:DB3.dbo.Student

から

選択*

私も自分を変えたくない、今DB3を指すように、すべてのストアドプロシージャを変更したくありませんストアドプロシージャで動的SQLに書き込まれたクエリ(動的SQLを作成することでこれを行うことができます)。

DB1.dbo.Studentを実行すると、DB3.dbo.Studentにリダイレクトされます。中間層または任意のSQL設定。

私にとって非常に大きな助けになるでしょう。前もって感謝します !!

答えて

0

SQL Serverスクリプトジェネレータツールを使用して、すべてのストアドプロシージャを単純にスクリプト化します。次に、スクリプトで置換を検索し、テキスト 'DB1.dbo。'を検索し、 'DB3.dbo'と置き換えます。

今後、外部テーブルを参照するために同義語を使用することを検討してください。すべてのプロシージャの代わりに同義語を更新してください。同義語で、次のMSDNの記事を参照してください:同義語の

https://msdn.microsoft.com/en-us/library/ms187552.aspx

使用例:

USE [DB1] 
    GO 

    -- Create a synonym for table A located in DB2. 
    CREATE SYNONYM [dbo].[External_TableA] FOR [DB2].[dbo].[TableA] 
    GO 

    -- Synonym is pointing to TableA in DB2 , select statement will return data from DB2 tabla A. 
    SELECT * 
    FROM [External_TableA] 

    GO 

    -- Point the Synonym to same table but on DB3 
    DROP SYNONYM [dbo].[External_TableA] 
    CREATE SYNONYM [dbo].[External_TableA] FOR [DB3].[dbo].[TableA] 

    GO 

    -- No update was needed on views or stored procedure. 
    -- Synonym is pointing to TableA in DB3 , select statement will return data from DB3 tabla A. 
    SELECT * 
    FROM [External_TableA] 

フォロークエリが必要なDROPを生成して、古いデータベースからシノニムを再マッピングするためのスクリプトを作成します。新しいデータベース。

DECLARE @oldDB NVARCHAR(100) = 'DB2'; 
    DECLARE @newDB NVARCHAR(100) = 'DB3'; 

    SELECT 'DROP SYNONYM [dbo].[' + name + ']' AS [Drop Script] 
      ,'CREATE SYNONYM [dbo].[' + name + '] FOR ' + REPLACE(base_object_name, @oldDB, @newDB) AS CreateScript 
    FROM sys.synonyms 
    ORDER BY name 
+0

あなたの答えはありがとうございます。私はハードコードをもう一度やりたくありません。ストアドプロシージャを変更せずにDB3を呼び出す方法が必要です。 – MehraG

+0

悲しいことに、DBをパラメータとして渡すことを知っている唯一の方法は、すべてのプロシージャを動的SQLとして書き直すことです。これははるかに悪いメンテナンスの悪夢です。私はまだ同義語の使用をお勧めします。動的ではありませんが、残りのストアド・プロシージャやビューに影響を与えずにシノニムを更新できます。シノニムを自動的に削除して再作成できるコードを作成する方がずっと簡単です。私は元の答えに例を追加しました。 –

0

その活用を使用するには、キーワード

[アクセスしたいデータベース名]を使用すると、場合 GO

例えば

use [db1] 
select *from yourTableName 
exec yourStoredProcedure parm1,parm2,.... 
Go 
1

を使用したい クエリとストアドプロシージャを使用しますデータベースの名前を変更する目的は、データベースを移行することです。次に、データベースの名前を変更するのはなぜですか?

DB1の名前をDB1_oldに変更し、DB3の名前をDB1に変更してください。

+0

これは私にとって最も簡単な解決策です。 – TJB

関連する問題