除了我的previous post之外,我还想将依赖对象(例如视图或程序)复制到静态'数据库。但是, Production 和 Static 数据库之间的模式名称和其他对象前缀不同...
[我已经在设置审核数据库时阅读了Aaron Bertrand's articles,但这对我们目前的需求来说有点多了。]
使用一些动态sql将对象定义提取到变量后,我为每个更改运行多个replace
语句,以便视图/过程仍然运行,从 Static 中提取数据数据库中。
replace
语句的原因是视图/过程是使用不同的命名约定创建的。有时我会找到<dbname>.dbo.<objectname>
,有时会找到<dbname>..<objectname>
甚至只是dbo.<objectname>
!
而不是使用如下的多个replace
语句(我觉得这可能会变得非常大!),有没有更好的方法?表格驱动的方法(使用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]
非常感谢提前。
答案 0 :(得分:1)
您遇到的另一个问题是使用OBJECT_DEFINITION
。这仅返回对象名称的前4,000个字符。
使用INFORMATION_SCHEMA.ROUTINES
存在同样的问题。
查看这篇文章,讨论替代方案......
答案 1 :(得分:0)
“但是,生产和静态数据库之间的模式名称和其他对象前缀不一样”
那就是你的问题。让他们一样,你的问题就会消失。在SQL Server支持多个实例的情况下,应该没有障碍。
答案 2 :(得分:0)
@ben:从几个生产数据库中提取静态数据库,并且希望通过在静态数据库中使用数据库名称作为模式名称来维护原始“源”。
封闭。与this post
重复