0

在我之前的帖子之后,我想将依赖对象(例如视图或过程)复制到“静态”数据库。但是,生产数据库和静态数据库之间的模式名称和其他对象前缀并不相同...

[我已经阅读了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 回答