SQL Server 数据库项目调试和发布的不同配置

问题描述

我有一个 sql Server 数据库项目 (.sqlproj),我将其用作 CI/CD 管道的一部分来部署数据库更改。我想将相同的代码部署到两个数据库(Dev 和 Production),但每个数据库的配置略有不同:

开发中,我有一个 Azure AD 组Database-Dev-Developers

CREATE USER [Database-Dev-Developers] FOR EXTERNAL PROVIDER;

生产中,我有一个 Azure AD 组Database-Prod-Developers

CREATE USER [Database-Prod-Developers] FOR EXTERNAL PROVIDER;

我无法根据配置更改构建/发布的脚本。理想情况下,我希望能够在构建时(调试/发布)指定项目配置,这会更改输出

我曾尝试为 .sqlproj 文件中的相关文件添加条件表达式,但这没有效果

Condition=" '$(Configuration)' == 'Debug' "

解决方法

您应该考虑在您的管道中使用 Token Replacement 步骤。您可以为 Dev 和 Prod 添加不同的变量值来替换令牌。那么您只需要一个可用于开发和生产的标记化配置文件。

我不完全确定在 .sqlproj 文件中使用令牌是多么的洁净,这取决于您要替换的配置。但我已经看到它在基于 .NET Core 的现代项目中的 ...config.json 文件中非常成功地使用。

您可以研究的另一件事是File Transformations。不过我没有任何使用这些经验。

,

我找到了这个问题的部分解决方案。可以创建一个发布配置文件,其中包含忽略某些对象类型的说明。请参阅 this helpful blog post,其中详细介绍了该过程,总结如下:

  1. 在 Visual Studio 中,右键单击 SSDT 项目
  2. 发布 -> 高级
  3. 选择“放置”选项卡,然后选中“将对象放置在目标中但不在源中”
  4. 选中要忽略的对象类型旁边的“不要丢弃...”。对我来说,这是“不要删除用户”和“不要删除角色”
  5. 保存发布配置文件

Azure DevOps Azure SQL Database deployment 任务的额外步骤,在“发布配置文件”设置中指定生成的发布配置文件 xml 文件。

这有一个缺点,即无法部署非敏感安全设置(例如角色成员资格),但这是我愿意在我的情况下做出的权衡。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...