Основные различия между триггерами DDL и триггерами DML

Триггеры DDL и триггеры DML используются для решения разных задач.

Триггеры DML создаются для инструкций INSERT, UPDATE и DELETE, чтобы обеспечить соблюдение бизнес-правил и целостность данных таблиц или представлений при их изменении.

Триггеры DDL применяются к инструкциям CREATE, ALTER, DROP и некоторым другим инструкциям DDL, а также к хранимым процедурам, которые выполняют схожие с DDL операции. Используют их для выполнения административных задач и гарантии соблюдения бизнес-правил, влияющих на базы данных. Действие этих триггеров распространяется на все команды одного типа во всей базе данных или на всем сервере.

Чтобы создать, изменить или удалить триггеры DML и триггеры DDL, используется похожий синтаксис Transact-SQL, к тому же они имеют и другие похожие характеристики.

Как и триггеры DML, триггеры DDL могут выполнять управляемый код, упакованный в сборку, созданную в среде Microsoft .NET Framework и переданную на SQL Server. Дополнительные сведения см. в разделе Программирование триггеров CLR.

Как и в случае триггеров DML, для одной инструкции Transact-SQL можно создать несколько триггеров DDL. Кроме того, триггер DDL и инструкция, приводящая к его срабатыванию, выполняются в одной транзакции. В триггере можно выполнить откат этой транзакции. Серьезные ошибки могут приводить к автоматическому откату целой транзакции. Срабатывание триггера DDL, выполняемого в пакете и явно включающего инструкцию ROLLBACK TRANSACTION, приводит к отмене целого пакета. Дополнительные сведения см. в разделе Использование триггеров DML, содержащих инструкции COMMIT или ROLLBACK TRANSACTION.

ПримечаниеПримечание

Откат событий ALTER DATABASE, возникших внутри триггера DDL, невозможен.

Подобно триггерам DML, триггеры DDL могут быть вложенными. Дополнительные сведения см. в разделе Использование вложенных триггеров.

При разработке триггеров DDL учитывайте их следующие отличия от триггеров DDL.

  • Триггеры DDL выполняются только после завершения инструкции Transact-SQL. Триггеры DDL нельзя использовать в качестве триггеров INSTEAD OF.

  • Триггеры DDL не создают таблицы inserted и deleted. Сведения о событии, приведшем к срабатыванию триггера DDL, и последующих изменениях, выполненных триггером, можно получить при помощи функции EVENTDATA. Дополнительные сведения см. в разделе Использование функции EVENTDATA.

См. также

Основные понятия