0

以前の投稿に加えて、依存オブジェクト (ビューやプロシージャなど) を「静的」データベースにコピーしたいと考えています。ただし、スキーマ名とその他のオブジェクトの接頭辞は、本番データベースと静的データベースで同じではありません...

[ Auditデータベースのセットアップに関する Aaron Bertrand の記事を読みましたが、これは現時点での私たちのニーズには少し足りません。]

動的SQLを使用してオブジェクト定義を変数に抽出した後、replace変更ごとに複数のステートメントを実行して、ビュー/プロシージャが引き続き実行され、静的データベースからデータをプルします。

ステートメントの理由はreplace、ビュー/プロシージャが異なる命名規則を使用して作成されているためです。を見つけることもあれば<dbname>.dbo.<objectname><dbname>..<objectname>単にdbo.<objectname>!を見つけることもあります。

以下のように複数のステートメントを使用する代わりにreplace(これは非常に大きくなる可能性があります!)、より良い方法はありますか? テーブル駆動型のアプローチ ( a を使用CURSOR) はより賢明/最も賢明でしょうか?

[以下のコードでは、わかりやすくするためにデータベース/オブジェクト名が変更されています]

declare @sql nvarchar(500), @parmdef nvarchar(500), 
        @dbname varchar(20), @objname varchar(255), @ObjDef varchar(max);
set @dbname = 'ProdC';

--declare cursor; get object name using cursor on dbo.ObjectsToUpdate
--[code removed for simplicity]

set @sql = N'USE '+quotename(@dbname) +'; ' ;
set @sql = @sql + N'SELECT @def=OBJECT_DEFINITION(OBJECT_ID(''dbo.'+@objname+ '''));'
set @parmdef = N'@def nvarchar(max) OUTPUT' ;
exec sp_executesql @sql, @parmdef, @def=@ObjDef OUTPUT;

--Carry out object definition replacements
set @ObjDef= replace(@ObjDef, 'CREATE VIEW [dbo].[', 'ALTER VIEW ['+@dbname+'].[');
set @ObjDef= replace(@ObjDef, 'Prod1.dbo.', @dbname+'.'); --replace Prod1 with @dbname
set @ObjDef= replace(@ObjDef, ' dbo.', ' '+@dbname+'.'); --replace all 'dbo.'
set @ObjDef= replace(@ObjDef, 'dbo.LookupTable1', @dbname+'.LookupTable1');
--[code removed for simplicity]

exec(@ObjDef);

--get next object name from cursor
--[remaining code removed for simplicity]

よろしくお願いします。

4

3 に答える 3

1

あなたが持っている別の問題は、使用していますOBJECT_DEFINITION。これにより、オブジェクト名の最初の 4,000 文字のみが返されます。

を使用しても同じ問題が存在しINFORMATION_SCHEMA.ROUTINESます。

代替案の議論については、この投稿をチェックしてください...

于 2012-04-19T15:30:48.137 に答える
0

「ただし、スキーマ名とその他のオブジェクトの接頭辞は、本番データベースと静的データベースで同じではありません」

そこがあなたの問題です。それらを同じにすると、問題はなくなります。複数のインスタンスをサポートする SQL Server では、それを行う上での障壁はありません。

于 2012-04-27T14:40:30.220 に答える
0

@ben: スタティック データベースは複数のプロダクション データベースからプルされ、スタティック データベースのスキーマ名としてデータベース名を使用して元の「ソース」を維持したいという要望があります。

閉まっている。この投稿と重複

于 2012-05-04T13:15:46.087 に答える