在视图定义(SQL Server 2008 R2)中更改硬编码数据库引用的最佳方法是什么?

时间:2011-07-20 17:18:42

标签: sql-server sql-server-2008-r2

我通过从不同名称的另一台服务器恢复一组备份,创建了一组相关数据库的本地副本。

所以我从另一台服务器上获取了名为ABCMain和ABCDependent的数据库的bak文件,并在我的本地SQL Server实例上将它们恢复为XYZMain和XYZDependent。

不幸的是,___ Dependendent DB中的所有视图定义都有硬编码的数据库限定符,指向ABCMain,如下所示:

CREATE VIEW dbo.[MyView] AS SELECT * FROM [ABCMain].dbo.MyTable

我需要在XYZDependent的1000多个视图中删除“[ABCMain]”或将其更改为“[XYZMain]”。 SQL Server不允许更改系统目录。

有什么想法吗?

谢谢,

约翰

2 个答案:

答案 0 :(得分:3)

您可能需要考虑使用SQL Synonyms来引用另一个数据库中的表而不是当前的视图策略。有关优缺点的讨论,请参阅this question。这不会解决您当前的问题,但您可能会发现使用同义词可以获得更好的性能。你真正想要的是引用数据库而不是特定表的SQL同义词,you are not alone

我处理此问题的首选方法是使用SQL Sever Management Studio编写所有视图的脚本:

  1. 右键单击数据库,然后从中选择生成脚本... 任务菜单
  2. 在“选择对象”页面上,选择选择特定数据库对象,然后单击视图复选框以选择所有视图。
  3. 设置脚本选项页面上,单击高级按钮,然后选择脚本DROP和CREATE作为选项。
  4. 通过搜索并替换数据库名称来修改生成的脚本。包括括号和点(。)以避免意外重命名其他对象,例如替换'[ABCMain]。'与'[XYZMain]。'。
  5. 这不是很优雅,但它可以很快完成工作。希望微软会在某些时候添加数据库同义词。

答案 1 :(得分:1)

我认为你可以很容易地在.NET SMO框架中这样做。它就像一个10行的PowerShell脚本。伪代码:

<load the frameworks>

$ssrv = new-object "Microsoft.SqlServer.Management.SMO.Server" $Servname

$sdb = New-Object "Microsoft.SqlServer.Management.SMO.Database"
$sdb = $ssrv.Databases[$DBName]

$sdb.Views | Foreach-object {$_.textbody = $_.textbody -replace '[MyOldDB]', '[MyNewDB]'}

您需要查看实际的方法和属性,但它应该非常简单。

相关问题