我在MSDN论坛上问了这个问题而没有任何回复。也许在这有人可以帮助我?
我认为这是SSDT中的一个错误而且相当陈旧。我已经尝试了几个版本的SSDT二进制文件,但问题仍然存在。 SQLPackage.exe不会正确排除触发器,尤其是在加密时。情况:
create table dbo.TheTable(Name varchar(30) not null); create trigger dbo.trgInsTheTable on dbo.TheTable with encryption for insert as print 'insert to TheTable';
SqlPackage.exe /Action:Extract /TargetFile:"DB.dacpac" /SourceDatabaseName:"DB" /SourceServerName:".\Sandbox"
SqlPackage.exe /Action:Script /SourceFile:".\DB.dacpac" /Profile:".\Sandbox.Publish.xml" /p:CreateNewDatabase=True /OutputPath:".\DB.sql"
抛出以下错误:
错误SQL0:无法将元素[dbo]。[trgInsTheTable]部署为 脚本体已加密。
SqlPackage.exe / Action:Script /SourceFile:".\DB.dacpac“/Profile:".\Sandbox.Publish.xml”/ p:CreateNewDatabase = True /OutputPath:".\DB.sql“/ p :ExcludeObjectTypes = DatabaseTriggers; ServerTriggers
再次抛出上述错误。 唯一但不可接受的方法是将表添加到ExludeObjectTypes。然后排除此触发器,但与表一起创建。
发布XML文件可以是任何默认值。
我在这里缺少什么?
答案 0 :(得分:0)
它似乎不是一个错误,但功能是不能排除任何DML触发器。我尝试排除简单的非加密触发器,它也没有用。
现在我需要考虑如何克服这种情况,当我拥有所有代码都已加密的数据库dacpac时,我只需要部署来自该dacpac的表,并且我不能排除加密的DML触发器,而所有其他代码(如存储过程)和功能已被成功排除。
希望这将在下一个SSDT版本中修复。
答案 1 :(得分:0)
我发现了类似的问题。我正在尝试使用新内容更新触发器,但触发器应该在完成时保持禁用状态。触发器在启动之前被禁用。触发器在完成时启用。 WTH?
dac发布操作会更新触发器内容,但会启用触发器内容。我现在跑了几十次测试用例。我只是恢复数据库并再次运行。同样的问题。
我在修改后的表上第二次运行dac操作,dac注意到启用的触发器并禁用它。没有其他操作要做。因此,解决方法是两次运行所有dac操作以清除在第一次通过时意外启用的任何触发器。
我相信这是某种错误。当你在未经许可的情况下启用触发器时,这是一个特别令人讨厌的事情。
答案 2 :(得分:0)
似乎不能排除DML触发器? :(
尝试了此最新版本的sqlpackage.exe 2019年10月29日18.4 15.0.4573.2