有几种方法可以实现这一点,第一种方法是在部署后脚本中检查环境,例如..
if @@servername = 'dev_server'
begin
insert data here
end
一个稍微干净的版本是为每个环境使用不同的脚本文件,并通过 :r import sqlcmd 脚本导入它们,这样你就可以拥有:
- PostDeploy.sql
- 开发服务器.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 构建的一部分效果最好,我的过程是:
- 入住变更
- 构建服务器构建 dacpac
- 构建需要 dacpac,复制到 dev、qa、prod 等 env 文件夹
- Build 将每个中的部署后脚本替换为特定于 env 的脚本
我将脚本称为 PostDeploy.dev.sql、PostDeploy.Qa.sql 等,并将构建操作设置为“无”,或者将它们添加为“脚本,不在构建中”。
要替换部署后脚本,您只需要使用 .net Packaging 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));
}