将生产数据库复制到多个测试数据库的最佳方法是什么,同时保持完全限定名称的完整性?
目前,为了刷新测试环境,我们从生产数据库中恢复测试数据库。然后,我们编写所有存储过程/视图/等脚本。并在所有数据库引用上执行查找/替换以指向测试对象。在我们所有参考文献都正确之后,我们会改变它们。
例如,在从生产中复制数据库之后,我们将有一个类似的存储过程:
alter procedure dbo.SomeProcedure
as
select SomeColumn
from InternetSecurity.dbo.SomeTable
join Validation.dbo.AnotherTable on SomId = AnoId
对于测试数据库,它必须是:
alter procedure dbo.SomeProcedure
as
select SomeColumn
from InternetSecurityQA1.dbo.SomeTable
join ValidationQA1.dbo.AnotherTable on SomId = AnoId
每个测试数据库都有视图/存储过程/函数可以引用多达30个不同的其他测试数据库,因此“查找/替换”过程非常耗时并且容易出现很多错误。
恢复这些测试环境的最佳方法是什么?
我们正在使用SQL Server 2008R2。
答案 0 :(得分:1)
假设不同的环境位于不同的SQL Server上(或至少在不同的实例上),那么建议您将所有环境中的数据库名称保持完全相同。使用权限(例如集成安全性)确保只有正确的环境系统和用户才能访问相应的环境数据库。
但是,如果确实需要为不同的环境保留不同的数据库名称(例如,同一SQL实例上的所有环境),则可以使用sqlcmd with the -v开关来参数化数据库名称。
然后需要重写您的更改脚本:
alter procedure dbo.SomeProcedure
as
select SomeColumn
from [$(InternetSecurity)].dbo.SomeTable
join [$(Validation)].dbo.AnotherTable on SomId = AnoId
然后您可以编写批处理文件以将正确的参数值传递给sqlcmd。
或者,您可以在Visual Studio中使用.dbproj项目来设置多个配置,以便为每个环境提供不同的值,并从Visual Studio生成脚本/发布。
此外,AFAIK SQL Synonyms在这里真的不会有帮助。您需要将所有过程和函数中的3部分表名替换为同义词,这可能会使问题混淆,因为它无法清楚表是本地还是外部。
答案 1 :(得分:0)
据我所知,除了替换脚本中的数据库名称之外没有其他更简单的方法了。