多环境场景下的TFS / SSDT部署

时间:2016-08-29 01:46:26

标签: sql-server database visual-studio-2013 deployment sql-server-data-tools

这是我目前正在经历的情景。 在开发环境中,开发人员通常在DEV SQL Server中进行更改,然后他们将在Visual Studio 2013 / TFS中进行模式比较,更新TFS然后检查更改。

现在,在DEV中,在数据库中有许多存储过程引用名为A的数据库,但在SIT环境中,该数据库称为B.

当我想将这些存储过程从TFS部署到SIT环境时,是否有(自动)方法将数据库A替换为数据库B,以便存储的过程不会在SIT中断?

我做的解决方法是生成发布脚本(通过TFS>发布>生成脚本),然后将该脚本复制并粘贴到SSMS,用数据库B替换对数据库A的所有引用。 然而,这是非常手动的(并非万无一失 - 必须非常小心要替换什么),所以我想知道是否有一个功能/能力以更有效的方式进行这项练习?

提前致谢。

干杯

2 个答案:

答案 0 :(得分:2)

有一项功能,但可能需要对您的工作流程进行一些重大更改。

您可以在SSDT中使用SQL Server数据库项目来存储数据库代码。在这种情况下,您可以使用补充数据库名称声明项目级变量,然后使用SQLCMD语法在SSDT项目中引用其对象。

或者更好的是,您可以为两个数据库创建项目,并将后者的DACPAC文件添加为前者的外部参考。它将自动创建一个相应的SQLCMD变量,并使Intellisense可用于链接数据库'对象。

在部署期间,您可以使用更改生成发布脚本,并仅在发布脚本的开头更新此SQLCMD变量的值。

当然,这种方法要求首先在SSDT项目中引入数据库中的所有更改,然后再将其部署到实际实例中。然而,好处远远超过额外的麻烦。

答案 1 :(得分:2)

如果您想继续使用已连接的工作流程来编辑数据库,您可能会考虑在数据库中使用同义词:而不是使用3部分参考,这可能会改变,具体取决于在您部署的环境中,您可以将变量部分放入同义词中,并使存储过程的内容保持静态。

为了做到这一点,您需要首先为要跨数据库边界引用的每个表创建一个同义词,例如。

CREATE SYNONYM [dbo].[Syn_MyTable] FOR [$(OtherDb)].[dbo].[MyTable]

然后,代替表名,引用你的过程中的synoynms,例如:

CREATE PROCEDURE MyProc AS SELECT ID FROM [Syn_MyTable]

即使采用这种方法,但需要注意的是,如果您尝试使用SSDT执行此类工作流程,那么您仍然会对抗谷物,因为SSDT主要是断开连接数据库编辑工具。例如,如果使用模式比较将更改从开发环境引入项目,则如果目标数据库名称不同,SSDT可能会看到对同义词的更改。因此需要特别小心,以确保不会覆盖项目的同义词定义中的变量语法。

我们在Redgate制作的名为ReadyRoll的产品支持另一种数据库开发方法。 ReadyRoll是SSDT的项目子类型,实际上有利于连接的编辑工作流程。例如,对于ReadyRoll,如果使用同义词,那么在将更改导入项目时,它将忽略数据库引用中的任何差异(因为这些变量本质上被视为变量)。

您可以在此论坛帖子上阅读有关同义词如何在ReadyRoll中工作的更多信息,包括示例项目: https://forums.red-gate.com/viewtopic.php?f=199&t=79564&sid=314391978c186c19e50d9d69f266a700