繁体   English   中英

多环境方案中的TFS / SSDT部署

[英]TFS / SSDT Deployment in Multi Environment Scenario

这是我目前遇到的情况。 在开发环境中,开发人员通常在DEV SQL Server中进行更改,然后他们将在Visual Studio 2013 / TFS中进行架构比较,更新TFS,然后检查更改。

现在,例如在DEV中,数据库中有许多存储过程都引用了称为A的数据库,但是在SIT环境中,此数据库称为B。

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

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

提前致谢。

干杯

有一个功能,但是可能需要在工作流程中进行一些重大更改。

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

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

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

当然,此方法要求首先将数据库中的所有更改引入SSDT项目中,然后再部署到实际实例中。 但是,好处远远超过了其他麻烦。

如果您想继续使用连接的工作流程来编辑数据库,则可以考虑在数据库中使用同义词:与其使用一个三部分的引用,该引用可能会因部署环境的不同而不同,但可以分为三部分。将变量部分放入同义词中,并使存储过程的内容保持静态。

为此,您需要首先为要跨数据库边界引用的每个表创建一个同义词,例如

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

然后,代替表名,在您的proc中引用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM