使用 visual studio ssdt 为不同的发布配置文件部署不同的种子数据?

Deploy different seed data for different publish profiles using visual studio ssdt?

是否可以使用 visual studio Sql 服务器数据工具数据库项目为不同的发布配置文件部署不同的种子数据集?

我们知道您可以使用 post 部署脚本来部署种子数据。 我们知道您可以使用发布配置文件工具部署到不同的环境。 我们不知道的是如何将不同的种子数据部署到不同的环境。

我们为什么要这样做?

有几种方法可以实现这一点,第一种方法是检查 post 部署脚本中的环境,例如..

if @@servername = 'dev_server'
begin
   insert data here
end

一个更简洁的版本是为每个环境使用不同的脚本文件,并通过 :r import sqlcmd 脚本导入它们,这样你就可以:

  • PostDeploy.sql
  • DevServer.sql
  • QAServer.sql

然后

if @@servername = 'dev_server'
begin
   :r DevServer.sql
end
if @@servername = 'qa_server'
begin
   :r QAServer.sql
end

您需要确保 .sql 文件的路径正确,然后使用 dacpac 复制它们。

您不必使用 @@servername,您可以使用 sqlcmd 变量并将它们传递给每个环境,这又比硬编码的服务器名称更简洁。

第二种方法是使 dacpac 情绪化,以根据您的环境特定脚本更改 post delpoy 脚本,这是我的首选,并且作为 CI 构建的一部分效果最好,我的过程是:

  1. 签到更改
  2. 构建服务器构建 dacpac
  3. 构建采用 dacpac,复制到 dev、qa、prod 等 env 文件夹
  4. Build 用环境特定脚本替换每个中的 post-deploy 脚本

我调用脚本 PostDeploy.dev.sql、PostDeploy.Qa.sql 等并将构建操作设置为 "None" 或者它们被添加为 "Script, Not in Build".

要替换 post-deploy 脚本,您只需要使用 .net 打包 API 或者查看我的 Dir2Dac 演示中的一些示例,它可以执行此操作以及更多操作:

https://github.com/GoEddie/Dir2Dac

更具体地说:

https://github.com/GoEddie/Dir2Dac/blob/master/src/Dir2Dac/DacCreator.cs

var part = package.CreatePart(new Uri("/postdeploy.sql", UriKind.Relative), "text/plain");

     using (var reader = new StreamReader(_postDeployScript))
     {
                reader.BaseStream.CopyTo(part.GetStream(FileMode.OpenOrCreate, FileAccess.ReadWrite));
     }

我已经通过编写一个 Powershell 脚本解决了这个问题,该脚本在发布时通过项目文件中的 Exec 命令自动执行。

它创建一个脚本文件,其中包括在项目文件夹中找到的所有脚本(该文件夹的名称与目标环境相同)。

此脚本随后包含在 post-部署脚本中。