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


Триггеры DML

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

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

Триггеры 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 триггер для поддержки вставок, обновлений и удаления ссылочных данных в нескольких таблицах. Еще одним преимуществом INSTEAD OF триггеров является то, что они позволяют кодировать логику, которая может отклонять части пакета, позволяя другим частям пакета успешно выполняться.

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

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

Обработка ограничений.

Декларативные ссылочные действия.

Создание таблиц inserted и deleted

Действие, запускающее триггер.
До: обработка ограничений

Вместо: действие, запускающее триггер

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

Триггер CLR

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

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