它是SSDT错误 - 不包括加密触发器吗?

时间:2017-11-24 08:02:28

标签: sql-server sql-server-data-tools sqlpackage

我在MSDN论坛上问了这个问题而没有任何回复。也许在这有人可以帮助我?

我认为这是SSDT中的一个错误而且相当陈旧。我已经尝试了几个版本的SSDT二进制文件,但问题仍然存在。 SQLPackage.exe不会正确排除触发器,尤其是在加密时。情况:

  1. 创建简单表dbo。空数据库中的表和加密触发器:
  2. 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';
    
    1. 使用SQLPackage.exe并将该数据库解压缩(动作:提取)到dacpac:
    2. SqlPackage.exe /Action:Extract /TargetFile:"DB.dacpac" /SourceDatabaseName:"DB" /SourceServerName:".\Sandbox"
      
      1. 运行SQLPackage.exe以生成脚本(Action:Script),可以使用相同的数据库:
      2. SqlPackage.exe /Action:Script /SourceFile:".\DB.dacpac" /Profile:".\Sandbox.Publish.xml" /p:CreateNewDatabase=True /OutputPath:".\DB.sql"
        

        抛出以下错误:

          

        错误SQL0:无法将元素[dbo]。[trgInsTheTable]部署为   脚本体已加密。

        1. 好的,现在让我们尝试只生成表格TheTable并使用/ p:ExludeObjectTypes = DatabaseTriggers; ServerTriggers:
        2.   

          SqlPackage.exe / Action:Script /SourceFile:".\DB.dacpac“/Profile:".\Sandbox.Publish.xml”/ p:CreateNewDatabase = True /OutputPath:".\DB.sql“/ p :ExcludeObjectTypes = DatabaseTriggers; ServerTriggers

          再次抛出上述错误。 唯一但不可接受的方法是将表添加到ExludeObjectTypes。然后排除此触发器,但与表一起创建。

          发布XML文件可以是任何默认值。

          我在这里缺少什么?

3 个答案:

答案 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