多环境场景TFS/SSDT部署
TFS / SSDT Deployment in Multi Environment Scenario
这就是我目前遇到的情况。
在开发环境中,开发人员通常在 DEV SQL 服务器中进行更改,然后他们会在 Visual Studio 2013 / TFS 中进行模式比较,更新 TFS,然后检查更改。
现在,比如在 DEV 中,数据库中有许多存储过程引用名为 A 的数据库,但是在 SIT 环境中,该数据库称为 B。
当我想将这些存储过程从 TFS 部署到 SIT 环境时,是否有一种(自动)方式将数据库 A 替换为数据库 B,以便存储过程不会在 SIT 中中断?
我所做的解决方法是生成发布脚本(通过 TFS > 发布 > 生成脚本),然后将该脚本复制并粘贴到 SSMS,将所有对数据库 A 的引用替换为数据库 B。
然而,这是非常手动的(而且不是万无一失的 - 必须非常小心更换什么),所以我想知道是否有 feature/capability 以更有效的方式进行此练习?
提前致谢。
干杯
有一个功能,但它可能需要对您的工作流程进行一些重大更改。
您可以在SSDT中使用SQL个服务器数据库项目来存储数据库代码。在这种情况下,您可以使用互补的数据库名称声明一个项目级变量,然后使用 SQLCMD 语法在您的 SSDT 项目中引用它的对象。
或者更好的是,您可以为两个数据库创建项目并将后者的 DACPAC 文件添加为前者的外部引用。它将自动创建相应的 SQLCMD 变量,并使 Intellisense 可用于链接数据库的对象。
在部署期间,您可以生成包含更改的发布脚本,并仅更新发布脚本开头的 SQLCMD 变量的值。
当然,这种方式要求数据库的所有变更都先引入到SSDT项目中,再部署到实际实例中。然而,好处远远大于额外的麻烦。
如果您想继续使用 connected 工作流程来编辑您的数据库,您可能会考虑在您的数据库中使用同义词:而不是使用由 3 部分组成的参考,这可能会根据您要部署到的环境而变化,您可以将变量部分放入同义词中并保持存储过程的内容静态。
为此,您需要首先为要跨数据库边界引用的每个 table 创建一个同义词,例如
CREATE SYNONYM [dbo].[Syn_MyTable] FOR [$(OtherDb)].[dbo].[MyTable]
然后,代替 table 名称,在您的过程中引用同义词,例如:
CREATE PROCEDURE MyProc AS
SELECT ID FROM [Syn_MyTable]
即使采用这种方法,需要注意的是,如果您尝试使用 SSDT 遵循这种工作流程,您仍然会违背常规,因为 SSDT 主要是 断开连接数据库编辑工具。例如,如果使用架构比较将更改从您的开发环境引入项目,则如果目标数据库名称不同,SSDT 可能会看到同义词的更改。因此需要特别注意确保项目同义词定义中的变量语法不被覆盖。
我们在 Redgate 开发的一款名为 ReadyRoll 的产品支持另一种数据库开发方法。 ReadyRoll 是 SSDT 的项目子类型,它实际上有利于连接的编辑工作流程。例如,对于 ReadyRoll,如果您使用同义词,那么在将更改导入您的项目时它将忽略数据库引用中的任何差异(因为这些本质上被视为变量)。
您可以在本论坛 post 上阅读有关同义词在 ReadyRoll 中如何工作的更多信息,包括示例项目:
https://forums.red-gate.com/viewtopic.php?f=199&t=79564&sid=314391978c186c19e50d9d69f266a700
这就是我目前遇到的情况。 在开发环境中,开发人员通常在 DEV SQL 服务器中进行更改,然后他们会在 Visual Studio 2013 / TFS 中进行模式比较,更新 TFS,然后检查更改。
现在,比如在 DEV 中,数据库中有许多存储过程引用名为 A 的数据库,但是在 SIT 环境中,该数据库称为 B。
当我想将这些存储过程从 TFS 部署到 SIT 环境时,是否有一种(自动)方式将数据库 A 替换为数据库 B,以便存储过程不会在 SIT 中中断?
我所做的解决方法是生成发布脚本(通过 TFS > 发布 > 生成脚本),然后将该脚本复制并粘贴到 SSMS,将所有对数据库 A 的引用替换为数据库 B。 然而,这是非常手动的(而且不是万无一失的 - 必须非常小心更换什么),所以我想知道是否有 feature/capability 以更有效的方式进行此练习?
提前致谢。
干杯
有一个功能,但它可能需要对您的工作流程进行一些重大更改。
您可以在SSDT中使用SQL个服务器数据库项目来存储数据库代码。在这种情况下,您可以使用互补的数据库名称声明一个项目级变量,然后使用 SQLCMD 语法在您的 SSDT 项目中引用它的对象。
或者更好的是,您可以为两个数据库创建项目并将后者的 DACPAC 文件添加为前者的外部引用。它将自动创建相应的 SQLCMD 变量,并使 Intellisense 可用于链接数据库的对象。
在部署期间,您可以生成包含更改的发布脚本,并仅更新发布脚本开头的 SQLCMD 变量的值。
当然,这种方式要求数据库的所有变更都先引入到SSDT项目中,再部署到实际实例中。然而,好处远远大于额外的麻烦。
如果您想继续使用 connected 工作流程来编辑您的数据库,您可能会考虑在您的数据库中使用同义词:而不是使用由 3 部分组成的参考,这可能会根据您要部署到的环境而变化,您可以将变量部分放入同义词中并保持存储过程的内容静态。
为此,您需要首先为要跨数据库边界引用的每个 table 创建一个同义词,例如
CREATE SYNONYM [dbo].[Syn_MyTable] FOR [$(OtherDb)].[dbo].[MyTable]
然后,代替 table 名称,在您的过程中引用同义词,例如:
CREATE PROCEDURE MyProc AS
SELECT ID FROM [Syn_MyTable]
即使采用这种方法,需要注意的是,如果您尝试使用 SSDT 遵循这种工作流程,您仍然会违背常规,因为 SSDT 主要是 断开连接数据库编辑工具。例如,如果使用架构比较将更改从您的开发环境引入项目,则如果目标数据库名称不同,SSDT 可能会看到同义词的更改。因此需要特别注意确保项目同义词定义中的变量语法不被覆盖。
我们在 Redgate 开发的一款名为 ReadyRoll 的产品支持另一种数据库开发方法。 ReadyRoll 是 SSDT 的项目子类型,它实际上有利于连接的编辑工作流程。例如,对于 ReadyRoll,如果您使用同义词,那么在将更改导入您的项目时它将忽略数据库引用中的任何差异(因为这些本质上被视为变量)。
您可以在本论坛 post 上阅读有关同义词在 ReadyRoll 中如何工作的更多信息,包括示例项目: https://forums.red-gate.com/viewtopic.php?f=199&t=79564&sid=314391978c186c19e50d9d69f266a700