我们在 SQL Server 数据库项目中有源代码控制下的现有数据库,其中许多数据库相互引用。
将它们纳入项目和源代码控制非常具有挑战性,尽管我发现在不使用新的 SQL 服务器实例的情况下很难设置开发/测试环境。
目前,我们在一个测试 SQL 实例上有一个数据库副本,它被用作持续部署的一部分。我想要做的是在一个分支中开发并在同一实例上使用 Dev 前缀的数据库,尽管我意识到这些将引用用于持续部署的数据库。
这是否可以通过在数据库引用中使用数据库变量而不仅仅是名称来实现,如果是这样的话,如何以及是否有办法在项目之间共享 SQLCMD 变量?有没有其他方法可以考虑?
我倾向于建议使用多个 publish.xml 文件,如Jamie Thompson 博客所述
然后可以将数据库名称(或前缀)存储为 SQLCMD 变量。
然后将构建每个发布文件并将其发布为构建工件——您需要编写自定义 powershell 或批处理作业以根据服务器名称选择正确的文件。(您可以在此处使用服务器名称作为开关)
您需要为每个环境设置一次发布文件,但一旦该工作完成,就不需要再做一次。
在以前的生活中,我在每个环境的不同服务器上管理了一个相当大的实现,其中包含大量相同的数据库以及一些控制数据库。我们有很多跨数据库查询,无论是在开发、QA、测试、预生产、生产等方面,它们都必须以相同的方式工作。我的解决方案——而不是有一些脚本来更新所有服务器和跨数据库引用——是使用同义词。
在 Dev 中,一切都在一台服务器上:
在 QA 中,控制表位于另一台服务器上:
现在,任何一个环境中任何数据库中的所有代码都需要简单地引用控制表
dbo.ControlTable
,并且我们将同义词排除在我们的自动同步/部署之外(除非同义词实际发生变化)。如果我们将该表移动到不同的数据库,或者有一个不同名称的数据库,或者将该数据库移动到不同的服务器,我们不必触及任何代码 - 我们只是删除并重新创建同义词。
在您的情况下,您的开发项目/开发数据库中的同义词可能只是:
在您的生产数据库中:
如果你想让同义词名称与对象名称相同,你可以将同义词放在它们自己的模式中:
再次在开发数据库中,它只是:
(现在只需将同义词 - 或该模式 - 作为项目中可单独部署的东西,以避免交叉线。)
我在这里写了关于同义词的博客。它们是一个非常有用但未被充分利用的功能: