【问题标题】:TFS / SSDT Deployment in Multi Environment Scenario多环境场景下的 TFS/SSDT 部署
【发布时间】:2016-08-29 01:46:25
【问题描述】:

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

现在,比如说在 DEV 中,一个数据库中有很多存储过程引用了一个名为 A 的数据库,但是在 SIT 环境中,这个数据库被称为 B。

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

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

提前致谢。

干杯

【问题讨论】:

  • 发布配置文件和项目变量将是首先想到的事情。发布配置文件以更轻松地标准化选项。用于存储数据库名称的项目变量。 (如果引用外部数据库,您可以使用数据库引用进行设置。)

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


【解决方案1】:

有一个功能可以做到这一点,但它可能需要对您的工作流程进行一些重大更改。

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

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

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

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

【讨论】:

  • 感谢您的回复,罗杰沃尔夫。如果我理解正确,您的建议将涉及对所有数据库对象进行更改,例如所有存储的过程以确保它们使用 SQLCMD 变量。这是正确的吗?
  • @iKnowNothing,是的 - 当您需要将它们部署到不同的环境中时,您现在所做的更改完全相同。只有这一次您只需要在数据库项目代码中执行一次。
  • 有没有办法(批量)更新 TFS 中的数据库对象,以便它们使用 SQLCMD 变量?例如,为数据库项目中的所有数据库对象创建一个脚本,然后更新数据库引用以使用 SQLCMD 变量,然后以某种方式将它们存储/保存回 TFS。有没有这样的方法?
  • 我不这么认为。创建新的数据库项目,从现有数据库导入模式,用相应的 SQLCMD 变量大量替换外部引用,然后将该项目放入 TFS,最好切断以前脚本的遗留 - 这就是我会做的。我不知道您现在如何存储架构,但格式很可能会太不同。这就是为什么我说这可能是一个突破性的变化。
  • 如何批量替换外部引用?将架构从现有数据库导入新数据库项目时是否有选项?
【解决方案2】:

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

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

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

然后,代替表名,在您的过程中引用同义词,例如:

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

【讨论】:

  • 谢谢丹。这是否意味着我需要修改所有存储的过程以确保它们使用创建的同义词(而不是使用 3 部分命名约定)?
  • @iKnowNothing 恐怕很不幸
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 2015-07-29
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多