使用sqlpackage.exe发布dacpac时,它首先运行Schema Compare,然后运行预部署脚本.例如,当您需要删除表或重命名列时,这会导致问题.架构比较是在修改对象和部署失败之前完成的.必须重复发布才能考虑新模式.
解决方法
Gert Drapers将其称为预部署前脚本
here
实际上这是一个挑战.如果需要将非可空和外键列添加到充满数据的表中 – 您只能使用单独的脚本.
如果您是唯一的开发人员 – 这不是问题,但是当您拥有一个大型团队时,必须在每次数据库发布之前以某种方式执行“单独脚本”.
我们使用的解决方法:
>创建单独的sql“Before-publish”脚本(在DB项目中),该脚本具有[Build action = None]属性
>创建custom MSBuild Task在哪里调用sqlCMD.EXE实用程序,将“Before-publish”脚本作为参数传递,然后调用sqlPACKAGE.EXE实用程序传递DB.dacpac
>将自定义MSBuild任务的调用添加到db.sqlproj文件.例如:
<UsingTask TaskName="MSBuild.Mssql.DeployTask" AssemblyFile="$(MSBuildProjectDirectory)\Deploy\MsBuild.Mssql.DeployTask.dll" /> <Target Name="AfterBuild"> <DeployTask Configuration="$(Configuration)" DeployConfigPath="$(MSBuildProjectDirectory)\Deploy\Deploy.config" ProjectDirectory="$(MSBuildProjectDirectory)" OutputDirectory="$(OutputPath)" DacVersion="$(DacVersion)"> </DeployTask> </Target>
上面的MsBuild.Mssql.DeployTask.dll是自定义MSBuild任务.
因此,可以从Visual Studio调用“Before-publish”脚本.
对于CI,我们使用批处理文件(* .bat),其中调用了相同的两个实用程序(sqlCMD.EXE和sqlPACKAGE.EXE).
原文地址:https://www.jb51.cc/mssql/78144.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。