Основные различия между триггерами 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.