Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是不是SSDT错误-不包括加密触发器?_Sql Server_Sql Server Data Tools_Sqlpackage - Fatal编程技术网

Sql server 是不是SSDT错误-不包括加密触发器?

Sql server 是不是SSDT错误-不包括加密触发器?,sql-server,sql-server-data-tools,sqlpackage,Sql Server,Sql Server Data Tools,Sqlpackage,我在MSDN论坛上问过这个问题,没有任何回应。也许有人能帮我 我认为这是SSDT中的一个bug,而且非常旧。我尝试了几种版本的SSDT二进制文件,但问题仍然存在。SQLPackage.exe无法正确排除触发器,尤其是在触发器已加密的情况下。情况: 在空数据库中创建简单表dbo.TheTable和加密触发器: 使用SQLPackage.exe并将该数据库提取(操作:提取)到dacpac: 运行SQLPackage.exe生成脚本(操作:Script),可以使用相同的数据库: 并抛出以下错误: 错误

我在MSDN论坛上问过这个问题,没有任何回应。也许有人能帮我

我认为这是SSDT中的一个bug,而且非常旧。我尝试了几种版本的SSDT二进制文件,但问题仍然存在。SQLPackage.exe无法正确排除触发器,尤其是在触发器已加密的情况下。情况:

  • 在空数据库中创建简单表dbo.TheTable和加密触发器:
  • 使用SQLPackage.exe并将该数据库提取(操作:提取)到dacpac:
  • 运行SQLPackage.exe生成脚本(操作:Script),可以使用相同的数据库:
  • 并抛出以下错误:

    错误SQL0:元素[dbo].[TrginsetTable]无法作为部署 脚本主体已加密

  • 好的,现在让我们试着生成表TheTable,并使用/p:ExludeObjectTypes=DatabaseTriggers;服务器触发器:
  • SqlPackage.exe/Action:Script/SourceFile:“.\DB.dacpac”/Profile:“.\Sandbox.Publish.xml”/p:CreateNewDatabase=True/OutputPath:”.\DB.sql”/p:ExcludeObjectTypes=DatabaseTriggers;服务器触发器

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

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


    我在这里遗漏了什么?

    这似乎不是一个bug,而是一个无法排除任何DML触发器的特性。我试图排除简单的未加密触发器,但它也不起作用

    现在我需要考虑如何克服数据库dacpac中所有代码都加密的情况,我只需要部署dacpac中的表,我不能排除加密的DML触发器,而所有其他代码(如存储过程和函数)都已成功排除


    希望在下一个SSDT版本中修复此问题。

    我发现了类似的问题。我正在尝试用新内容更新触发器,但是当他完成时,触发器应该保持禁用状态。在他开始之前,扳机被禁用了。当他完成时,触发器被启用。什么

    dac发布操作更新触发器内容,但同时启用触发器。我现在已经运行了几十次测试用例。我只是恢复数据库并再次运行。同样的问题

    我在修改后的表上再次运行dac操作,dac注意到已启用的触发器并将其禁用。没有其他操作要做。因此,解决方法是运行所有dac操作两次,以清除在第一次运行时意外启用的任何触发器


    我相信这是某种错误。当您在未经许可的情况下启用触发器时,这是一个特别令人讨厌的问题。

    看起来无法排除DML触发器:(

    已尝试此最新版本的sqlpackage.exe
    2019年10月29日18.4 15.0.4573.2

    数据库触发器和服务器触发器都是两种类型。表触发器既不是数据库触发器,也不是服务器触发器,因此,排除这两种类型都不会阻止表触发器被包括在内。感谢@Damien_非信徒的评论-这解释了这种情况。我已经尝试过了排除简单的未加密触发器,它也不起作用。这意味着它的一个功能是不能专门排除任何DML触发器。这也意味着,还不可能从数据库中创建dacpac,并对所有代码进行加密,并且只从中部署特定对象,排除所有加密代码。我只是做了一些调查这似乎不是一个bug,而是sql server的预期行为。对禁用触发器的任何更改都会在您完成后将触发器设置为enabled(启用)。我猜Microsoft认为,如果您更改触发器的内容,他们会在不通知的情况下启用它,从而帮助您解决问题。
    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"