Сценарии DDL в блоке транзакции вступают в силу даже при наличии ошибок - PullRequest
1 голос
/ 18 января 2011

У меня есть несколько файлов сценариев sql, где я делаю некоторые изменения DDL как часть блока фиксации

BEGIN TRANSACTION

-- CREATE/ALTER TABLE, COLUMNS, CONTRAINTS etc etc
COMMIT

Иногда, когда сценарий не выполняется, я все еще вижу изменения в DDL, примененные в базе данных, хотя все этов блоке транзакции.Что мне здесь не хватает?

Ответы [ 3 ]

3 голосов
/ 18 января 2011

То, что конкретный оператор вызывает ошибку, не означает, что другие операторы также не будут выполняться. Посмотрите документацию для XACT_ABORT :

В первом наборе операторов генерируется ошибка, но другие операторы выполняются успешно и транзакция успешно фиксируется

Если вы хотите откатить транзакцию при возникновении ошибки, вам нужно заключить код в TRY ... CATCH блок (или более старый стиль, отметьте @@ERROR после оператора ever и перейдите метка, где будет ROLLBACK).

1 голос
/ 14 марта 2012

@ MartinSmith прав, когда говорит, что это не так с состояниями SQL Server.MSDN: «... Вы можете использовать все операторы Transact-SQL в явной транзакции, за исключением следующих: ALTER DATABASE CREATE FULLTEXTУКАЗАТЕЛЬ ALTER FULLTEXT КАТАЛОГ УСТАНОВКИ БАЗЫ ДАННЫХ ALTER FULLTEXT УКАЗАТЕЛЬ КАТАЛОГ УПАКОВКИ FULLTEXT РЕЗЕРВНОЕ КОПИРОВАНИЕ УСТАНОВКА БАЗЫ ДАННЫХ FRELLTEXT ПЕРЕСЫЛКА БАЗЫ РЕКОНФИГУРАЦИИ СОЗДАТЬ КАТАЛОГ FULLTEXT ВОССТАНОВЛЕНИЕ "

0 голосов
/ 18 января 2011

DDL для внутреннего использования использует commit.DDL-статус не может быть rollback с помощью команды rollback.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...