web-dev-qa-db-ja.com

ビューとストアドプロシージャでデータベース名を検索して置換する

私は少し苦境にあります。少数のデータベースには1,000を超えるビューとストアドプロシージャがあり、別のデータベースを追跡するようにハードコーディングされています。

私の例では、SQL Serverのデータベース名はHost_1およびLOYALTY_1です。ビューおよびプロシージャは、FROMおよびJOINステートメントのHost_PRODおよびLOYALTY_PRODの後に移動しようとしています。 PROD1で置き換えるために、すべてのビューとプロシージャでグローバルな検索と置換を行う方法はありますか?

それぞれを右クリックして、alterスクリプトを新しいウィンドウに作成し、テキストを変更してF5キーを押すよりも簡単な方法が必要です。必要な変更をすべて作成して一度に実行できたとしても、それでうまくいきます。

5
Connor

これは、sys.objectsテーブルとOBJECT_DEFINITION()関数を使用して行うことができます。

SELECT OBJECT_DEFINITION(id) AS ORIGINAL, 
    REPLACE(OBJECT_DEFINITION(id),'VALUE_TO_BE_REPLACED', 'VALUE_TO_REPLACE_WITH') AS UPDATED
    ,*
FROM sys.sysobjects o
WHERE xtype = 'V'

このクエリの「UPDATED」列を使用すると、ビュー定義で見つかったデータベースまたはテーブルの名前をすばやく検索して置換できます。検索するテキストのすべての可能なバージョンについて、同じことを確認する必要があります。たとえば、「db」と呼ばれるデータベースは、[db]またはdbと記述される場合があります。クエリから必要なものを取得したら、コピーしてクエリウィンドウに貼り付け、すべてを実行します。実行する前に、必ずデータベースをバックアップしてください。また、出力テキストを注意深く校正して、置換が正しく機能し、意図したよりも誤って変更されていないことを確認できます。

ところで、WEI_DBAの回答も完全に受け入れられます。同じことに対する異なるアプローチです。彼の例では、GUIはすべてのオブジェクト定義をクエリウィンドウに表示するのに役立ちます。次に、Find/Replace(ctrl + h)を使用してデータベース名を置き換えます。この場合、自分自身に。
私のアプローチでは、クエリを特定のオブジェクト(この場合はビュー)だけに制限して、where句で必要に応じて追加のフィルターを追加できることを除いて、どちらのアプローチにも利点があることはわかりません。生成スクリプトを使用すると、ビュー、ストアドプロシージャなどのみにフィルターを適用し、オブジェクトを個別に選択できますが、追加のフィルターは、UIが実行できるすべてのものに制限されます。

4
Shooter McGavin

以下はおそらくあなたに必要なものを与えるでしょう:

SELECT 
    '-------------------------------------'  + CHAR(13) + CHAR(10) +
    'DROP ' + IIF(o.type = 'P', 'PROCEDURE', 'VIEW') + ' [' + s.name + '].[' + o.name + ']'  + CHAR(13) + CHAR(10) +
    'GO' + CHAR(13) + CHAR(10) +
    REPLACE(REPLACE([definition],'Host_PROD','Host_1'),'LOYALTY_PROD','LOYALTY_1') + CHAR(13) + CHAR(10) +
    'GO' + CHAR(13) + CHAR(10)
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id = o.object_id
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE o.[type] IN ('P','V')
AND [definition] LIKE '%Host_PROD%' OR [definition] LIKE '%LOYALTY_PROD%'

これは必要なプロシージャのみを取得し、それらを再作成する前に削除し、面白い名前付きのプロシージャ/ビューを考慮します。結果をコピーして、新しいクエリウィンドウに貼り付けることができます。私のテストシステムでうまく機能するようです。

ただし、最初にこれを確認してください。データベースと損害については、あなたが責任を負います。

2
blobbles