Большинство операторов DDL объекта базы данных могут быть частью пользовательской транзакции. Существуют некоторые исключения, например, операции, связанные с файлами самой базы данных (например, ALTER DATABASE ... ADD / REMOVE FILE). На уровне сервера снова большинство объектов могут быть частью транзакции. Исключением являются такие объекты, как конечные точки, которые могут запускать или останавливать сокет прослушивания.
Общее практическое правило заключается в том, что если операция является метаданными, то она может быть частью транзакции. Если это операция с внешними побочными эффектами (создание файла, открытие сокета и т. Д.), То она не может быть частью транзакции, поскольку откат не может быть гарантирован.
Подавляющее большинство операторов DDL являются только метаданными, все, что они делают, это изменяют некоторые таблицы каталога метаданных (например, они добавляют строку в sys.tables) и, таким образом, они ведут себя так же, как любая другая транзакционная операция: если транзакция выполняется откат строки удаляется, следовательно, таблица «исчезает». Здесь есть больше деталей (например, sys.tables - это представление поверх реальных внутренних таблиц, таких как sys.objects $, и это реальная таблица, изменяемая CREATE TABLE), но на высоком уровне это то, что происходит.