Триггеры DMLDML Triggers

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Триггеры DML — это хранимые процедуры особого типа, автоматически вступающие в силу, если происходит событие языка обработки данных DML, которое затрагивает таблицу или представление, определенное в триггере.DML triggers is a special type of stored procedure that automatically takes effect when a data manipulation language (DML) event takes place that affects the table or view defined in the trigger. События DML включают инструкции INSERT, UPDATE или DELETE.DML events include INSERT, UPDATE, or DELETE statements. Триггеры DML могут использоваться для предписания бизнес-правил и правил целостности данных, выполнения запросов к другим таблицам и включения сложных инструкций Transact-SQLTransact-SQL .DML triggers can be used to enforce business rules and data integrity, query other tables, and include complex Transact-SQLTransact-SQL statements. Триггер и инструкция, при выполнении которой он срабатывает, считаются одной транзакцией, которую можно откатить назад внутри триггера.The trigger and the statement that fires it are treated as a single transaction, which can be rolled back from within the trigger. При обнаружении серьезной ошибки (например, нехватки места на диске) вся транзакция автоматически откатывается назад.If a severe error is detected (for example, insufficient disk space), the entire transaction automatically rolls back.

Преимущества триггеров DMLDML Trigger Benefits

Триггеры DML аналогичны ограничениям в том, что могут предписывать целостность сущностей или целостность домена.DML triggers are similar to constraints in that they can enforce entity integrity or domain integrity. Вообще говоря, целостность сущностей должна всегда предписываться на самом нижнем уровне с помощью индексов, являющихся частью ограничений PRIMARY KEY и UNIQUE или создаваемых независимо от ограничений.In general, entity integrity should always be enforced at the lowest level by indexes that are part of PRIMARY KEY and UNIQUE constraints or are created independently of constraints. Целостность домена должна быть предписана через ограничения CHECK, а ссылочная целостность — через ограничения FOREIGN KEY.Domain integrity should be enforced through CHECK constraints, and referential integrity (RI) should be enforced through FOREIGN KEY constraints. Триггеры DML наиболее полезны в тех случаях, когда функции ограничений не удовлетворяют функциональным потребностям приложения.DML triggers are most useful when the features supported by constraints cannot meet the functional needs of the application.

В следующем списке приведено сравнение триггеров DML с ограничениями и указано, в чем триггеры DML имеют преимущества.The following list compares DML triggers with constraints and identifies when DML triggers have benefits over .

  • Триггеры DML позволяют каскадно проводить изменения через связанные таблицы в базе данных; но эти изменения могут осуществляться более эффективно с использованием каскадных ограничений ссылочной целостности.DML triggers can cascade changes through related tables in the database; however, these changes can be executed more efficiently using cascading referential integrity constraints. Ограничения FOREIGN KEY могут проверить значения столбца только на предмет точного совпадения со значениями другого столбца, за исключением случаев, когда с помощью предложения REFERENCES задаются каскадные ссылочные действия.FOREIGN KEY constraints can validate a column value only with an exact match to a value in another column, unless the REFERENCES clause defines a cascading referential action.

  • Для предотвращения случайных или неверных операций INSERT, UPDATE и DELETE и реализации других более сложных ограничений, чем те, которые определены при помощи ограничения CHECK.They can guard against malicious or incorrect INSERT, UPDATE, and DELETE operations and enforce other restrictions that are more complex than those defined with CHECK constraints.

    В отличие от ограничений CHECK, DML-триггеры могут ссылаться на столбцы других таблиц.Unlike CHECK constraints, DML triggers can reference columns in other tables. Например, триггер может использовать инструкцию SELECT для сравнения вставленных или обновленных данных и выполнения других действий, например изменения данных или отображения пользовательского сообщения об ошибке.For example, a trigger can use a SELECT from another table to compare to the inserted or updated data and to perform additional actions, such as modify the data or display a user-defined error message.

  • Чтобы оценить состояние таблицы до и после изменения данных и предпринять действия на основе этого различия.They can evaluate the state of a table before and after a data modification and take actions based on that difference.

  • Несколько DML-триггеров одинакового типа (INSERT, UPDATE или DELETE) для таблицы позволяют предпринять несколько различных действий в ответ на одну инструкцию изменения данных.Multiple DML triggers of the same type (INSERT, UPDATE, or DELETE) on a table allow multiple, different actions to take place in response to the same modification statement.

  • Ограничения могут сообщать об ошибках только с помощью соответствующих стандартных системных сообщений.Constraints can communicate about errors only through standardized system error messages. Если для пользовательского приложения требуются более сложные методы управления ошибками и, соответственно, пользовательские сообщения, то необходимо использовать триггер.If your application requires, or can benefit from, customized messages and more complex error handling, you must use a trigger.

  • При использовании триггеров DML может произойти откат изменений, нарушающих ссылочную целостность, что приводит к запрету модификации данных.DML triggers can disallow or roll back changes that violate referential integrity, thereby canceling the attempted data modification. Подобные триггеры могут применяться при изменении внешнего ключа в случаях, когда новое значение не соответствует первичному ключу.Such a trigger might go into effect when you change a foreign key and the new value does not match its primary key. Обычно в указанных случаях используются ограничения FOREIGN KEY.However, FOREIGN KEY constraints are usually used for this purpose.

  • Если в таблице триггеров существуют ограничения, то их проверка осуществляется между выполнением триггеров INSTEAD OF и AFTER.If constraints exist on the trigger table, they are checked after the INSTEAD OF trigger execution but prior to the AFTER trigger execution. В случае нарушения ограничений выполняется откат действий триггеров INSTEAD OF, а триггер AFTER не срабатывает.If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger is not executed.

Типы триггеров DMLTypes of DML Triggers

Триггер AFTERAFTER trigger
Триггеры AFTER выполняются после выполнения действий инструкции INSERT, UPDATE, MERGE или DELETE.AFTER triggers are executed after the action of the INSERT, UPDATE, MERGE, or DELETE statement is performed. Триггеры AFTER никогда не выполняются, если происходит нарушение ограничения, поэтому эти триггеры нельзя использовать для какой-либо обработки, которая могла бы предотвратить нарушение ограничения.AFTER triggers are never executed if a constraint violation occurs; therefore, these triggers cannot be used for any processing that might prevent constraint violations. Для каждой из операций INSERT, UPDATE или DELETE в указанной инструкции MERGE соответствующий триггер вызывается для каждой операции DML.For every INSERT, UPDATE, or DELETE action specified in a MERGE statement, the corresponding trigger is fired for each DML operation.

Триггер INSTEAD OFINSTEAD OF trigger
Триггеры INSTEAD OF переопределяют стандартные действия инструкции, вызывающей триггер.INSTEAD OF triggers override the standard actions of the triggering statement. Поэтому они могут использоваться для проверки на наличие ошибок или проверки значений на одном или нескольких столбцах и выполнения дополнительных действий перед вставкой, обновлением или удалением одной или нескольких строк.Therefore, they can be used to perform error or value checking on one or more columns and the perform additional actions before insert, updating or deleting the row or rows. Например, если обновляемое значение в столбце почасовой оплаты в таблице учетной ведомости начинает превышать определенное значение, то с помощью этого триггера можно либо задать вывод сообщения об ошибке и откатить транзакцию, либо сделать вставку новой записи в след аудита до вставки записи в таблицу учетной ведомости.For example, when the value being updated in an hourly wage column in a payroll table exceeds a specified value, a trigger can be defined to either produce an error message and roll back the transaction, or insert a new record into an audit trail before inserting the record into the payroll table. Главное преимущество триггеров INSTEAD OF в том, что они позволяют поддерживать обновления для таких представлений, которые обновлять невозможно.The primary advantage of INSTEAD OF triggers is that they enable views that would not be updatable to support updates. Например, в представлении, основанном на нескольких базовых таблицах, должен использоваться триггер INSTEAD OF для поддержки операций вставки, обновления и удаления, которые ссылаются на данные больше чем в одной таблице.For example, a view based on multiple base tables must use an INSTEAD OF trigger to support inserts, updates, and deletes that reference data in more than one table. Другое преимущество триггера INSTEAD OF состоит в том, что он обеспечивает логику кода, при которой можно отвергать одни части пакета и принимать другие.Another advantage of INSTEAD OF triggers is that they enable you to code logic that can reject parts of a batch while letting other parts of a batch to succeed.

Функциональность триггеров AFTER и INSTEAD OF сравнивается в следующей таблице.This table compares the functionality of the AFTER and INSTEAD OF triggers.

КомпонентFunction Триггер AFTERAFTER trigger Триггер INSTEAD OFINSTEAD OF trigger
Сущности, к которым применяется триггерApplicability ТаблицыTables Таблицы и представленияTables and views
Количество триггеров на таблицу или представлениеQuantity per table or view Несколько триггеров на одно запускающее триггеры действие (UPDATE, DELETE или INSERT).Multiple per triggering action (UPDATE, DELETE, and INSERT) Один триггер на одно запускающее триггеры действие (UPDATE, DELETE или INSERT).One per triggering action (UPDATE, DELETE, and INSERT)
Каскадные ссылкиCascading references Нет ограничений.No restrictions apply Триггеры INSTEAD OF UPDATE и DELETE нельзя определять для таблиц, на которые распространяются каскадные ограничения ссылочной целостности.INSTEAD OF UPDATE and DELETE triggers are not allowed on tables that are targets of cascaded referential integrity constraints.
ВыполнениеExecution После следующих операций.After:

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

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

Создание таблицinserted и deleted .inserted and deleted tables creation

Действие, запускающее триггер.The triggering action
Перед следующей операцией. Обработка ограничений.Before: Constraint processing

Вместо следующей операции: Действие, запускающее триггер.In place of: The triggering action

После: создание таблиц inserted и deletedAfter: inserted and deleted tables creation
Порядок выполненияOrder of execution Можно задать выполнение в первую и в последнюю очередь.First and last execution may be specified НеприменимоNot applicable
Ссылки на столбцыvarchar(max) , nvarchar(max) и varbinary(max) в таблицах inserted и deletedvarchar(max), nvarchar(max), and varbinary(max) column references in inserted and deleted tables РазрешеноAllowed РазрешеноAllowed
Ссылки на столбцыtext, ntextи image в таблицах inserted и deletedtext, ntext, and image column references in inserted and deleted tables Не допускаетсяNot allowed РазрешеноAllowed

Триггеры CLRCLR Triggers
Триггер CLR может быть либо триггером AFTER, либо триггером INSTEAD OF.A CLR Trigger can be either an AFTER or INSTEAD OF trigger. Триггер CLR может также являться триггером DDL.A CLR trigger can also be a DDL trigger. Вместо вызова хранимой процедуры на языке Transact-SQLTransact-SQL триггер CLR вызывает один или несколько методов управляемого кода, являющихся членами сборки, созданной с помощью среды .NET Framework и загружены в SQL ServerSQL Server.Instead of executing a Transact-SQLTransact-SQL stored procedure, a CLR trigger executes one or more methods written in managed code that are members of an assembly created in the .NET Framework and uploaded in SQL ServerSQL Server.

ЗадачаTask РазделTopic
Описывает, как создать триггер DML.Describes how to create a DML trigger. Создание триггеров DMLCreate DML Triggers
Описывает, как создать триггер CLR.Describes how to create a CLR trigger. Создание триггеров CLRCreate CLR Triggers
Описывает, как создать триггер DML для выполнения и однострочных, и многострочных операций модификации данных.Describes how to create a DML trigger to handle both single-row and multi-row data modifications. Создание триггеров DML для обработки нескольких строк данныхCreate DML Triggers to Handle Multiple Rows of Data
Описывает, как вкладывать триггеры.Describes how to nest triggers. Создание вложенных триггеровCreate Nested Triggers
Описывает, как указывать порядок, в котором активируются триггеры AFTER.Describes how to specify the order in which AFTER triggers are fired. Указание первого и последнего триггеровSpecify First and Last Triggers
Описывает, как использовать специальные таблицы inserted и deleted в коде триггера.Describes how to use the special inserted and delete tables in trigger code. Использование таблиц inserted и deletedUse the inserted and deleted Tables
Описывает, как изменить или переименовать триггер DML.Describes how to modify or rename a DML trigger. Изменение или переименование триггеров DMLModify or Rename DML Triggers
Описывает, как просматривать сведения о триггерах DML.Describes how to view information about DML triggers. Получение сведений о триггерах DMLGet Information About DML Triggers
Описывает, как удалять или отключать триггеры DML.Describes how to delete or disable DML triggers. Удаление или отключение триггеров DMLDelete or Disable DML Triggers
Описывает, как управлять безопасностью триггеров.Describes how to manage trigger security. Управление безопасностью триггеровManage Trigger Security

См. также:See Also

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