Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: 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 |
Описывает, как управлять безопасностью триггеров. | Управление безопасностью триггера |