我正在尝试从 CMD 行获取用于模式比较的 SQLPackage。必须将主数据库与 300 个实时数据库进行比较。所有 2014 年的 SQL 都没有注册为数据层应用程序。PowerShell 和 3rd 方工具目前不是一个选项。
我在这里的第一个答案中遵循了脚本: https ://stackoverflow.com/questions/20673516/command-line-api-for-schema-compare-in-ssdt-sql-server-database-project
我可以从我的源和目标成功地创建 .DACPAC 文件。
如果我将一些对象(1 个表,3 个视图)添加到“Test_B”数据库,当我将主对象与数据库本身或生成的 .dacpac 进行比较时,比较脚本不会显示这些差异。但是,如果我从 VS 运行 SSDT 模式比较,它会选择它们并将创建一个带有预期 DROP 语句的 .sql 脚本。
所以问题是:我在 Visual Studio/SSDT 做对的 cmd 行做错了什么?缺少参数?事情的顺序不对?
#Compare DACPACs
sqlpackage.exe /a:Script /sf:C:\Users\hillke4\Documents\SQLScripts\DACPACS\ACACalculationDB.JTA.v7.master.dacpac /tf:C:\Users\hillke4\Documents\SQLScripts\DACPACS\ACACalculationDB.JTA.v7.Test_B.dacpac /tdn:ACACalculationDB.JTA.v7.Test_B /op:C:\Users\hillke4\Documents\SQLScripts\DACPACS\Deltas\ACACalculationDB.JTA.v7.Test_B.sql
#Compare master dacpac to database
sqlpackage.exe /a:Script /sf:C:\Users\hillke4\Documents\SQLScripts\DACPACS\ACACalculationDB.JTA.v7.master.dacpac /tsn:US1213113W1\SQL2014 /tdn:ACACalculationDB.JTA.v7.Test_B /op:C:\Users\hillke4\Documents\SQLScripts\DACPACS\Deltas\ACACalculationDB.JTA.v7.Test_B.sql
问题是使用脚本或部署操作时的默认部署选项设置为避免丢弃对象,从而将数据丢失的风险降至最低。另一方面,模式比较针对的是交互模式,其中操作(添加、删除、更新)更加清晰,因此不会发生这种情况。要按预期生成 Drop 语法,请将下面显示的属性(来自SqlPackage.exe 文档)添加到您的调用中。
属性:/p:DropObjectsNotInSource= {True | 错误的}
默认值:假
说明:指定当您发布到数据库时,是否将从目标数据库中删除数据库快照 (.dacpac) 文件中不存在的对象。