Миф №4 – DDL триггеры (появились в SQL Server 2005) являются INSTEAD OF триггерами
FALSE
DDL триггеры в SQL Server реализованы как AFTER триггеры. Это означает то, что возникающие операции перехватываются DDL триггером (и опционально откатываются, если вы включили инструкцию ROLLBACK в тело триггера).
А это значит, что они не такие легковесные, как можно подумать. Представьте себе такую операцию:
ALTER TABLE MyBigTable ADD MyNewNonNullColumn VARCHAR (20) DEFAULT 'Paul';
В этом случае, если DDL триггер навешен на событие ALTER_TABLE, или что-нибудь более специфическое, вроде DDL_TABLE_EVENTS, мы получим следующее: каждая строка таблицы будет расширена, чтобы принять в себя новую колонку (так как она имеет не нулловое значение по умолчанию), и только после этого сработает триггер и ваша операция откатится. Согласитесь, это не есть хорошо (попробуйте сами и посмотрите лог при помощи fn_dblog – вы увидите откат операции).
В этом случае будет лучше явно выдавать разрешения на ALTER операции, или создавать хранимые процедуры, при помощи которых выполнять только заранее определённые DLL операции.
В любом случае, DDL триггеры позволяют эффективно реализовать откат операции, но довольно дорогой ценой. К тому же, они позволяют реализовать аудит действий, происходящих на сервере.Так что, я не говорю: "Не используйте", – просто будьте осторожны.
Об авторе:
Пол С. Рэндал (Paul S. Randal) — генеральный директор SQLskills.com является MVP по SQL Server. Он работал в группе подсистемы хранилища SQL Server в корпорации Майкрософт с 1999 по 2007 г. Пол является автором DBCC CHECKDB/восстановления SQL Server 2005 и в ходе разработки SQL Server 2008 отвечал за программу базовой подсистемы хранилища. Пол является специалистом по аварийному восстановлению, высокой доступности и обслуживанию базы данных и часто дает презентации на различных конференциях по всему миру. Он ведет блог по адресу SQLskills.com/blogs/paul.
Ссылки по теме:
- Оригинал статьи
- "EXECUTE AS" and an important update your DDL Triggers (for auditing or prevention)
- Триггеры DDL