0

如果我在 Database1 上创建了一个存储过程。并且查询正在访问 Database2。
生产环境与开发环境的数据库名称不同。
现在我必须检查每个过程,以便将 Database2 更改为 Database_Prod2。

这很容易出错。我如何避免在查询中使用数据库名称。或者鉴于数据库名称必须不同,我如何避免此部署问题?

SELECT *
FROM [dbo].[MyTable] tab1
INNER JOIN [DB2].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID 

应该改为

SELECT *
FROM [dbo].[MyTable] tab1
INNER JOIN [DB_Prod2].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID 
4

2 回答 2

1

根据预算/复杂性,您可以使用许多解决方案来解决这个问题。这些是我的最爱:-

  1. 在虚拟环境中复制您的实时环境并针对“安全”副本进行编码。
  2. 使用视图将您的逻辑与表隔离开来。这些视图可以很容易地从信息模式中创建,因此它们具有与基础表相同的结构。然后,您可以将视图定位到您想要的任何“实时”数据库。
  3. 为所有模式对象创建同义词,并且只针对它们进行编码。在部署解决方案时切换同义词的目标。参考

复制您的环境是最灵活的解决方案 - 但它也是最复杂和最昂贵的。它使您有机会将您的开发人员与您的实时系统(认证?)和数据完全隔离开来。以可重复和可测试的方式打包部署的原则也是非常可取的。

使用视图和同义词是一种更简单/更便宜的解决方案 - 但需要更多的纪律和代码审查等。

于 2013-11-10T15:17:28.933 回答
0

使用动态语句:

CREATE PROC (@DBName varchar(100)
  --other params
)
AS 
BEGIN 
DECLARE @SQL VARCHAR(MAX) =''
SET @SQL =
'
SELECT *
FROM [dbo].[MyTable] tab1
INNER JOIN ['+@DBName+'].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID 
'
EXEC(@SQL)
END
于 2013-11-10T09:05:35.530 回答