我通过从不同名称的另一台服务器恢复一组备份,创建了一组相关数据库的本地副本。
所以我从另一台服务器上获取了名为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不允许更改系统目录。
有什么想法吗?
谢谢,
约翰
答案 0 :(得分:3)
您可能需要考虑使用SQL Synonyms来引用另一个数据库中的表而不是当前的视图策略。有关优缺点的讨论,请参阅this question。这不会解决您当前的问题,但您可能会发现使用同义词可以获得更好的性能。你真正想要的是引用数据库而不是特定表的SQL同义词,you are not alone。
我处理此问题的首选方法是使用SQL Sever Management Studio编写所有视图的脚本:
这不是很优雅,但它可以很快完成工作。希望微软会在某些时候添加数据库同义词。
答案 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]'}
您需要查看实际的方法和属性,但它应该非常简单。