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

Sql server 在视图定义(SQL Server 2008 R2)中更改硬编码数据库引用的最佳方法是什么?,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,通过从另一台服务器以不同的名称恢复一组数据库的备份,我创建了一组相关数据库的本地副本 因此,我从另一台服务器获取了名为ABCMain和ABCDependent的数据库的bak文件,并在本地SQL server实例上将它们恢复为XYZMain和XYZDependent 不幸的是,__dependent数据库中的所有视图定义都有硬编码的数据库限定符,指向ABCMain,如下所示: CREATE VIEW dbo.[MyView] AS SELECT * FROM [ABCMain].dbo.MyTa

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

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

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

CREATE VIEW dbo.[MyView] AS SELECT * FROM [ABCMain].dbo.MyTable
我需要在XYZDependent中的1000多个视图中删除[ABCMain]或将其更改为[XYZMain]。SQL Server不允许更改系统目录

有什么想法吗

谢谢


John

我认为,在.NETSMO框架中可以非常轻松地完成这项工作。这就像一个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]'}

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

我认为,您可以在.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]'}

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

,您可能需要考虑使用引用在另一个数据库中而不是当前视图策略的目的。有关利弊的讨论,请参阅。这不会解决您当前的问题,但您可能会发现同义词的性能更好。您真正需要的是引用数据库而不是特定表的SQL同义词,以及

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

右键单击数据库并选择生成脚本。。。从 任务菜单 在“选择对象”页面上,选择“选择特定数据库对象”,然后单击“视图”复选框以选择所有视图。 在“设置脚本选项”页面上,单击“高级”按钮,然后选择“脚本拖放和创建为选项”。 通过搜索并替换数据库名称来修改生成的脚本。包括括号和圆点。为避免意外重命名其他对象,例如将“[ABCMain]”替换为“[XYZMain]”。
这不是很优雅,但它很快就能完成任务。希望微软会在某个时候添加数据库同义词。

你可能想考虑使用引用在另一个数据库中而不是当前视图策略的目的。有关利弊的讨论,请参阅。这不会解决您当前的问题,但您可能会发现同义词的性能更好。您真正需要的是引用数据库而不是特定表的SQL同义词,以及

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

右键单击数据库并选择生成脚本。。。从 任务菜单 在“选择对象”页面上,选择“选择特定数据库对象”,然后单击“视图”复选框以选择所有视图。 在“设置脚本选项”页面上,单击“高级”按钮,然后选择“脚本拖放和创建为选项”。 通过搜索并替换数据库名称来修改生成的脚本。包括括号和圆点。为避免意外重命名其他对象,例如将“[ABCMain]”替换为“[XYZMain]”。
这不是很优雅,但它很快就能完成任务。希望微软能在某个时候添加数据库同义词。

谢谢,JNK。看起来很有希望。由于我还没有研究过.NETSMO框架,我个人会每1/2到3个月就遇到一次,所以我选择了更暴力的方式。谢谢,JNK。看起来很有希望。由于我还没有研究过.NET SMO框架,而且我个人每隔1/2到3个月就会遇到一次,所以我选择了更为暴力的路线。我很熟悉DROP and CREATE,因为我需要保留数据,我开玩笑的!。说真的,谢谢你,保罗。花了整整10分钟,我清除了977个这样的引用。我学会了删除和创建,因为我需要保留我开玩笑的数据!。说真的,谢谢你,保罗。花了整整10分钟,我清除了977个这样的参考资料。