2

将生产数据库复制到多个测试数据库,同时保持完全限定名称的完整性的最佳方法是什么?

目前为了刷新测试环境,我们从生产数据库恢复测试数据库。然后,我们编写所有存储过程/视图/等的脚本。并对所有数据库引用进行查找/替换以指向测试对象。在我们把所有的引用都正确之后,我们改变它们。

例如,从生产环境中复制数据库后,我们将有一个如下所示的存储过程:

alter procedure dbo.SomeProcedure
as
select SomeColumn
from DB.dbo.SomeTable
join Validation.dbo.AnotherTable on SomId = AnoId

对于测试数据库,它需要是:

alter procedure dbo.SomeProcedure
as
select SomeColumn
from DBQA1.dbo.SomeTable
join ValidationQA1.dbo.AnotherTable on SomId = AnoId

每个测试数据库都有视图/存储过程/函数可以引用多达30个不同的其他测试数据库,因此“查找/替换”过程非常耗时并且容易出错。

恢复这些测试环境的最佳方法是什么?

我们使用的是 SQL Server 2008R2。

4

2 回答 2

1

假设不同的环境在不同的 SQL Server 上(或至少在不同的实例上),那么建议您在所有环境中保持数据库名称完全相同。使用权限(例如集成安全性)确保只有正确的环境系统和用户才能访问适当的环境数据库。

但是,如果您确实需要为不同的环境(例如,同一 SQL 实例上的所有环境)保留不同的数据库名称,您可以考虑使用带有 -v开关的sqlcmd来参数化数据库名称。

然后,您的更改脚本需要像这样重写:

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同义词在这里并没有真正的帮助。您需要将所有过程和函数中的 3 部分表名称替换为同义词,这可能会混淆问题,因为它无法明确表是本地的还是外部的。

于 2012-08-02T05:15:40.103 回答
0

据我所知,没有比这里替换脚本中的数据库名称更简单的方法了。

于 2012-08-02T05:24:00.853 回答