2

我在 MSDN 论坛上问过这个问题,没有任何回应。也许这里有人可以帮助我?

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

  1. 在空数据库中创建简单表 dbo.TheTable 和加密触发器:
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:
SqlPackage.exe /Action:Extract /TargetFile:"DB.dacpac" /SourceDatabaseName:"DB" /SourceServerName:".\Sandbox"
  1. 运行SQLPackage.exe生成脚本(Action:Script),可以使用同一个数据库:
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:

SqlPackage.exe /Action:Script /SourceFile:".\DB.dacpac" /Profile:".\Sandbox.Publish.xml" /p:CreateNewDatabase=True /OutputPath:".\DB.sql" /p:ExcludeObjectTypes=数据库触发器;服务器触发器

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

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

我在这里想念什么?

4

3 回答 3

0

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

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

我在修改后的表上第二次运行他的 dac 操作,dac 注意到启用的触发器并禁用它。无需进行其他操作。因此,解决方法是运行所有 dac 操作两次,以清除在第一次通过时意外启用的任何触发器。

我确实相信这是某种错误。当您在未经许可的情况下启用触发器时,这尤其令人讨厌。

于 2018-02-18T13:23:21.713 回答
0

似乎这不是错误,而是无法排除任何 DML 触发器的功能。我尝试排除简单的未加密触发器,它也没有工作。

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

希望这将在下一个 SSDT 版本中得到修复。

于 2017-11-24T12:22:20.287 回答
0

看起来不能排除 DML 触发器?:(

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

于 2019-12-01T20:01:02.890 回答