Поделиться через


Триггеры DML

Триггеры DML — это особый тип хранимой процедуры, которая автоматически вступает в силу при возникновении события языка обработки данных (DML), влияющего на таблицу или представление, определенное в триггере. События DML включают инструкции INSERT, UPDATE или DELETE. Триггеры DML можно использовать для применения бизнес-правил и целостности данных, запроса других таблиц и включения сложных инструкций Transact-SQL. Триггер и запрос, который его запускает, рассматриваются как одна транзакция, которую можно откатить из триггера. Если обнаружена серьезная ошибка (например, недостаточно места на диске), вся транзакция автоматически откатывается.

Преимущества триггера DML

Триггеры DML похожи на ограничения, в которых они могут применять целостность сущностей или целостность домена. Как правило, целостность сущностей всегда должна применяться на самом низком уровне индексами, которые являются частью ограничений PRIMARY KEY и UNIQUE или создаются независимо от ограничений. Целостность домена должна применяться с помощью ограничений CHECK, а референтная целостность (RI) должна применяться с помощью ограничений FOREIGN KEY. Триггеры DML наиболее полезны, если функции, поддерживаемые ограничениями, не могут соответствовать функциональным потребностям приложения.

В следующем списке сравниваются триггеры DML с ограничениями и определяются, когда триггеры DML имеют преимущества по сравнению с .

  • Триггеры DML могут каскадно изменяться с помощью связанных таблиц в базе данных; Однако эти изменения можно выполнять более эффективно с помощью каскадных ограничений целостности. Ограничения FOREIGN KEY могут проверять значение столбца только с точным соответствием значению в другом столбце, если предложение REFERENCES не определяет каскадное действие ссылки.

  • Они могут защищаться от вредоносных или неправильных операций INSERT, UPDATE и DELETE и применять другие ограничения, которые являются более сложными, чем те, которые определены с ограничениями CHECK.

    В отличие от ограничений CHECK триггеры DML могут ссылаться на столбцы в других таблицах. Например, триггер может использовать select из другой таблицы для сравнения с вставленными или обновленными данными, а также для выполнения дополнительных действий, таких как изменение данных или отображение пользовательского сообщения об ошибке.

  • Они могут оценить состояние таблицы до и после изменения данных и выполнить действия на основе этой разницы.

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

  • Ограничения могут сообщать об ошибках только через стандартизированные системные сообщения об ошибках. Если ваше приложение требует или может выиграть от настраиваемых сообщений и более сложной обработки ошибок, необходимо использовать триггер.

  • Триггеры DML могут запретить или откатить изменения, которые нарушают целостность ссылок, тем самым отменяя попытку изменения данных. Такой триггер может вступить в силу при изменении внешнего ключа, и новое значение не соответствует его первичному ключу. Однако ограничения FOREIGN KEY обычно используются для этой цели.

  • Если ограничения существуют в таблице триггеров, они проверяются после выполнения триггера INSTEAD OF, но до выполнения триггера AFTER. Если ограничения нарушаются, то действия триггера INSTEAD OF откатываются, и триггер AFTER не выполняется.

Типы триггеров DML

Триггер типа AFTER
Триггеры AFTER выполняются после выполнения действия инструкции INSERT, UPDATE, MERGE или DELETE. Триггеры AFTER никогда не выполняются, если возникает нарушение ограничений; Таким образом, эти триггеры нельзя использовать для любой обработки, которая может предотвратить нарушения ограничений. Для каждого действия INSERT, UPDATE или DELETE, указанного в инструкции MERGE, для каждой операции DML запускается соответствующий триггер.

Триггер вместо
Триггеры INSTEAD OF переопределяют стандартные действия инструкции, вызывающей триггер. Поэтому их можно использовать для проверки ошибок или значений для одного или нескольких столбцов и выполнения дополнительных действий перед вставками, обновлением или удалением строки или строк. Например, если значение, обновляемое в почасовом столбце заработной платы в таблице заработной платы, превышает указанное значение, триггер можно определить для создания сообщения об ошибке и отката транзакции или вставки новой записи в след аудита перед вставкой записи в таблицу заработной платы. Основным преимуществом триггеров INSTEAD OF является включение представлений, которые не будут обновляться для поддержки обновлений. Например, представление на основе нескольких базовых таблиц должно использовать триггер INSTEAD OF для поддержки вставок, обновлений и удаления ссылочных данных в нескольких таблицах. Еще одним преимуществом триггеров INSTEAD OF является то, что они позволяют кодировать логику, которая может отклонять части пакета, позволяя другим частям пакета успешно выполняться.

В этой таблице сравниваются функциональные возможности триггеров AFTER и INSTEAD OF.

Функция Триггер типа AFTER INSTEAD OF триггер
Применимость Таблицы Таблицы и представления
Количество для таблицы или представления Несколько триггеров для каждого действия (UPDATE, DELETE и INSERT) Одно на действие триггера (UPDATE, DELETE и INSERT)
Каскадные ссылки Ограничения не применяются Триггеры INSTEAD OF UPDATE и DELETE не допускаются для таблиц, которые являются целевыми объектами каскадных ограничений ссылочной целостности.
Исполнение После:

Обработка ограничений
Декларативные референтные действия
Создание и удаление таблиц
Действие триггера
Прежде: обработка ограничений

Вместо этого: действие триггера

После: вставка и удаление таблиц
Порядок выполнения Можно указать первое и последнее выполнение. Неприменимо
varchar(max), nvarchar(max)и varbinary(max) ссылки на столбцы в вставленных и удаленных таблицах Допустимо Допустимо
text, ntextи image ссылки на столбцы в вставленных и удаленных таблицах Не разрешенный Допустимо

Триггеры CLR
Триггер СРЕДЫ CLR может быть триггером AFTER или INSTEAD OF. Триггер CLR также может быть триггером DDL. Вместо выполнения хранимой процедуры Transact-SQL триггер CLR выполняет один или несколько методов, написанных в управляемом коде, которые являются членами сборки, созданной в .NET Framework и отправленной в SQL Server.

Задача Тема
Описывает создание триггера DML. Создание триггеров DML
Описывает создание триггера CLR. Создать триггеры CLR
Описывается, как создать триггер DML для обработки изменений данных в одной строке и нескольких строках. Создание триггеров DML для обработки нескольких строк данных
Описывает, как вложить триггеры. Создание вложенных триггеров
Описывает, как задать порядок срабатывания триггеров AFTER. Указание первых и последних триггеров
Описание использования специальных таблиц для вставки и удаления в коде триггера. Использование вставленных и удаленных таблиц
Описывает изменение или переименование триггера DML. Изменение или переименование триггеров DML
Описание просмотра сведений о триггерах DML. Получение сведений о триггерах DML
Описывает удаление или отключение триггеров DML. Удаление или отключение триггеров DML
Описывает управление безопасностью триггера. Управление безопасностью триггера

См. также

CREATE TRIGGER (Transact-SQL)
ALTER TRIGGER (Transact-SQL)
DROP TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL)
Функции триггера (Transact-SQL)