Как наша база данных может вызвать сбой SqlPackage? (SQL72018)


Надеюсь, что кто-то еще столкнулся с этим, потому что Google возвращает только девять результатов для этой ошибки! Информация о SqlPackage все еще кажется немного скудной.

В настоящее время мы проходим процесс перехода к среде непрерывного развертывания. В рамках этого мы используем проекты баз данных для хранения схемы базы данных, а сервер сборки использует SqlPackage.exe для создания сценария обновления путем сравнения каждого проекта .файл dacpac с соответствующим шаблоном схемы база данных, размещенная на сервере.

На данный момент у нас есть шесть баз данных (с большим количеством впереди), и все они прекрасно работают, кроме одной, которая выдает следующую ошибку, когда SqlPackage моделирует "целевую" базу данных:

Ошибка SQL72018: триггер не удалось импортировать, но один или несколько из этих объектов существуют в исходном коде.

Единственное, о чем мы можем думать, это проблема с размером целевой базы данных; возможно, SqlPackage исчерпывает память? Это самая большая схема базы данных у нас есть, так что это, безусловно, выполнимо. Если это сводится к ограничению памяти SqlPackage, как мы можем его увеличить?

Мы собираемся начать удаление объектов из целевой базы данных и исходного проекта, чтобы увидеть, можем ли мы установить, является ли он размером или конкретным объектом схемы, но любые идеи и предложения в то же время были бы очень признательны!

Обновить

Я только что попытался удалить все триггеры из цели база данных, и теперь она выплевывает сценарий обновления без ошибок. Затем я попытаюсь удалить только половину из них, и посмотрим, смогу ли я сузить его до одного конкретного триггера. Я подозреваю, что это может быть просто Размер схемы, которая восходит к вопросу о памяти SqlPackage.

1 2

1 ответ:

Хорошо .. все продумал.

Мы прошли через процесс отбрасывания триггеров, пока не сузили его до единственного триггера, который вызывал ошибку. Оказывается, с ним было что - то не так-кажется, что он должен быть прикреплен к таблице, но это не так (т. е. он не появляется в списке триггеров). Так что я предполагаю, что это незначительное повреждение вызвало сбой 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