2013-08-29 99 views
1

我继承在MS SQL2008 R2大遗留系统引用远程MS SQL数据库。从存储过程

有大量引用另一个数据库的存储过程:

select * from MySeparateDatabase_LIVE.dbo.MyTable 
select * from MySeparateDatabase_STAGING.dbo.MyTable 
select * from MySeparateDatabase_TEST.dbo.MyTable 

不幸的是所有的活,分期和测试数据库在同一SQL实例和公司的限制意味着这不会很快改变。

问题来试图从测试更改推送到分期和生活。它需要大量的手动编辑或查找/替换 - 这会在关键系统上引入潜在的错误。

我可以采用什么技术来使用完全相同的SP在每个数据库上?

+0

你能提供一个更好的片的示例代码。没有理由你的示例代码不会在每个数据库上执行。 – gvee

+0

@ gvee第一个查询位于名为dbLive的数据库中,第二个查询位于名为dbStage的数据库中。每个数据库都应该引用其“伴随”数据库,但是为了这样做,当代码从测试数据库移动到临时数据库时,代码当前必须更改。 –

+0

如果您正在使用存储过程,则可以将MySeparateDatabase_XXX部分作为参数传递。这会将你的问题转移到你的SP被调用的部分,所以这可能是也可能不是解决方案。 – Sam

回答

5

Create SYNONYMs,例如在您的测试分贝:

CREATE SYNONYM dbo.MyTable FOR MySeparateDatabase_Test.dbo.MyTable; 

而在分期:

CREATE SYNONYM dbo.MyTable FOR MySeparateDatabase_Staging.dbo.MyTable; 

这提供了一个抽象层,并允许你在每个数据库相同的代码。通过这种方式,您可以一次部署不同的同义词,但这些过程可能是相同的(并且它们只会引用dbo.MyTable而不带数据库前缀,让同义词重定向到正确的数据库)。在测试分贝存储过程将参考表中的其他测试数据库,在暂存分贝一个存储过程将引用其他临时数据库表等

+0

更好的是,自动生成它们,这就是我的做法。 – RBarryYoung

+0

@RBarryYoung你能否详细说明一下? –

+0

我有我打电话传递一个数据库名称,将放弃所有的同义词在当前数据库的某个架构的程序,创建使用一个名称列表表或所有表的名称在同一个模式新异名在'DBO '作为指南命名数据库的模式。使切换阶段和/或部署到生产变得非常容易。 – RBarryYoung