希望其他人遇到过此问题,因为Google只返回9个错误结果!有关SqlPackage的信息似乎还有点不足.
我们目前正在进行迁移到持续部署环境的过程.作为其中一部分,我们使用数据库项目来存储数据库模式,构建服务器使用SqlPackage.exe通过比较每个项目的.dacpac文件与服务器上托管的关联模式模板数据库来生成升级脚本.
到目前为止,我们有六个数据库(还有更多),除了一个之外它们都工作正常,当SqlPackage为'target'数据库建模时会抛出以下错误:
错误SQL72018:无法导入触发器,但源中存在一个或多个这些对象.
我们唯一能想到的是目标数据库的大小问题; 也许SqlPackage内存不足?它是我们拥有的最大的数据库模式,所以它当然是可行的.如果它是SqlPackage的内存限制,我们如何增加它?
我们将开始从目标数据库和源项目中删除对象,以查看我们是否可以确定它是否符合规模或特定架构对象,但同时我们将非常感谢任何想法和建议!
更新
我刚刚尝试从目标数据库中删除所有触发器,现在它将没有错误地吐出升级脚本.接下来我将尝试仅删除其中的一半,看看我是否可以将其缩小到一个特定的触发器.我怀疑它可能只是模式的大小,这可以追溯到SqlPackage内存问题.
好的..解决了.
我们经历了一个删除触发器的过程,直到我们将其缩小到导致错误的单个触发器.事实证明它有一些相当不对的东西 - 它似乎是附加到一个表,但不是(即它没有出现在触发器列表中).所以我猜这个小的腐败导致SqlPackage失败.
如果有人发现它有用,这是我用来删除触发器范围的脚本,这帮助我找到了罪魁祸首:
http://www.codeproject.com/Tips/662699/Drop-all-Triggers-belonging-to-any-schema-in-MS-SQ
Use ClaimsSqlPackageTest DECLARE @SQLCmd nvarchar(1000) DECLARE @Trig varchar(500) DECLARE @sch varchar(500) Declare @count int = 0 DECLARE TGCursor CURSOR FOR SELECT ISNULL(tbl.name, vue.name) AS [schemaName] , trg.name AS triggerName FROM sys.triggers trg LEFT OUTER JOIN (SELECT tparent.object_id, ts.name FROM sys.tables tparent INNER JOIN sys.schemas ts ON TS.schema_id = tparent.SCHEMA_ID) AS tbl ON tbl.OBJECT_ID = trg.parent_id LEFT OUTER JOIN (SELECT vparent.object_id, vs.name FROM sys.views vparent INNER JOIN sys.schemas vs ON vs.schema_id = vparent.SCHEMA_ID) AS vue ON vue.OBJECT_ID = trg.parent_id OPEN TGCursor FETCH NEXT FROM TGCursor INTO @sch,@Trig WHILE @@FETCH_STATUS = 0 BEGIN SET @SQLCmd = N'DROP TRIGGER [' + @sch + '].[' + @Trig + ']' If @count >= 155 AND @count <= 160 Begin EXEC sp_executesql @SQLCmd PRINT @SQLCmd End Set @count = @count + 1 FETCH next FROM TGCursor INTO @sch,@Trig END CLOSE TGCursor DEALLOCATE TGCursor