2014-10-22 3 views
1

Используя msbuild с SSDT, я попробовал IncludeTransactionalScripts, но кажется, что он помещает только каждый оператор в отдельную транзакцию. Возможно ли опубликовать несколько проектов баз данных в качестве транзакции? Если нет, могу ли я хотя бы убедиться, что каждый проект будет опубликован в рамках транзакции?Публикация транзакций SSDT?

+1

Я думаю, что это делает это прямо сейчас, если вы выберете этот вариант. Он проверяет после каждой операции ошибку и обнаруживает, что один из них вызывает ROLLBACK для всего, что сделано в части изменения схемы. (Разделы Pre и post deploy являются отдельными и вне этого.) –

+0

Вы уверены? Глядя на скрипт, он генерирует несколько транзакций BEGIN и COMMIT, как и каждое изменение в своей собственной транзакции. Мне нужна одна большая сделка для партии. Конечно, это может быть непрактично, если есть много изменений, но иногда это может быть полезно. – SAS

+1

Он определенно откатывает все в части изменения схемы, если есть ошибка. Я знаю это от мучительной попытки проталкивать только часть проекта БД, когда у меня были зависимости от еще не созданной базы данных/таблицы. Найдите в сценарии разделы «IF @@ ERROR <> 0», и вы не должны видеть несколько коммитов, просто откаты. –

ответ

4

Для кого-то, кто нашел этот вопрос, но не знал, где искать:

Существует опубликовать настройки, «Включить транзакционные сценарии», который начинает транзакцию в начале публикации сценария. Затем он обертывает каждое изменение схемы в скрипте при проверке ошибок. При ошибках транзакция откатывается назад, а журнал ошибок увеличивается, но затем транзакция запускается с нуля. Если нет ошибок, транзакция продолжается неизрасходованного

BEGIN TRANSACTION 

...alter object here 

IF @@ERROR <> 0 @@TRANCOUNT > 0 
BEGIN 
    ROLLBACK; 
END 

IF @@TRANCOUNT = 0 
BEGIN 
    INSERT INTO #tmpErrors (Error) 
    VALUES     (1); 
    BEGIN TRANSACTION; 
END 

В конце концов, если ошибки были зарегистрированы, вся транзакция откатывается:

IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION 
GO 
IF @@TRANCOUNT>0 BEGIN 
PRINT N'The transacted portion of the database update succeeded.' 
COMMIT TRANSACTION 
END 
ELSE PRINT N'The transacted portion of the database update failed.' 
GO 

Примечание (как в комментарии выше), что это не включает ваши сценарии до и после развертывания, поэтому вы должны быть осторожны, чтобы обернуть их отдельно


Ссылка ниже в блоге Питера Шотт - это тот же самый парень, который заметил выше, я думаю, что - спасибо :)

http://schottsql.blogspot.co.uk/2012/11/ssdt-publishing-your-project.html

Он объясняет хорошо, как настроить эти параметры при использовании SSMS


Используя Visual Studio 2015, я обнаружил, что параметр «Включить транзакционные скрипты» не был установлен по умолчанию. Вы должны выбрать при определении параметров публикации ([Строить] >> [Опубликовать {имя проекта} ...]) в соответствии с [...] Дополнительно вкладки:

enter image description here enter image description here

Смежные вопросы