VS 2019 SQL Server数据库项目部署、预部署脚本及配置问题
问题1:多预部署脚本打包配置
- 首先确认你已经设置了1个主预部署脚本:右键该脚本→属性→将「生成操作」设置为「预部署脚本」,一个项目仅支持设置1个该类型的脚本
- 其余存放在PreDacpac文件夹的脚本,右键每个脚本→属性→将「生成操作」设置为「内容」,「复制到输出目录」设置为「如果较新则复制」,确保脚本会被纳入构建输出
- 在主预部署脚本中使用SQLCMD的
:r命令按执行顺序引用所有子脚本,示例语法如下:
-- 按顺序引入PreDacpac下的脚本,路径根据你的项目结构调整 :r .\PreDacpac\InitMigrationCheck.sql :r .\PreDacpac\CleanOldData.sql
构建项目时,VS会自动将所有引用的脚本内容展开合并到最终的预部署逻辑中,一并打包到dacpac文件里。
问题2:修改表结构前自动备份指定表数据
SQL Server数据库项目没有针对指定表组的一键备份可视化配置,常用实现方案如下:
- 轻量方案:在预部署脚本中编写自定义备份逻辑,先查询
migrations表判断本次部署是否涉及目标表的结构变更,确认需要变更时执行备份语句,示例逻辑:
IF EXISTS(SELECT 1 FROM sys.tables WHERE name = 'TargetTable' AND rows > 0) AND EXISTS(SELECT 1 FROM Migrations WHERE MigrationId = '本次部署的版本号' AND IsExecuted = 0) BEGIN -- 生成带时间戳的备份表 DECLARE @BackupTableName NVARCHAR(100) = 'TargetTable_Backup_' + REPLACE(CONVERT(VARCHAR(20), GETDATE(), 112), '-', '') + REPLACE(CONVERT(VARCHAR(20), GETDATE(), 108), ':', '') EXEC('SELECT * INTO ' + @BackupTableName + ' FROM TargetTable') END
- 高复用方案:如果需要全项目通用的自动备份逻辑,可以开发自定义部署贡献者(Deployment Contributors),在部署执行前自动扫描变更表列表执行备份,适合多项目统一规范的团队使用。
问题3:关闭数据丢失预警RaisingError配置
该配置的调整入口有两处:
项目全局配置(VS内生效)
- 右键数据库项目→选择「属性」→切换到「部署」选项卡→点击右下角的「高级」按钮
- 在弹出的高级部署设置窗口中,找到「如果可能发生数据丢失则阻止增量部署」(Block incremental deployment if data loss might occur)选项,取消勾选后保存配置即可
命令行部署配置
如果使用sqlpackage命令行执行部署,添加参数即可关闭该校验:
sqlpackage /Action:Publish /SourceFile:你的项目.dacpac /TargetConnectionString:"你的连接串" /p:BlockOnPossibleDataLoss=false
注意:关闭该配置后,表结构变更导致的数据删除操作会直接执行,部署前请务必做好数据校验和备份。
内容的提问来源于stack exchange,提问作者DotNetDude
相关产品推荐
相关产品推荐

