CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: да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

Создает триггер языка обработки данных, DDL или входа.Creates a DML, DDL, or logon trigger. Триггер — это особая разновидность хранимой процедуры, которая автоматически выполняется при возникновении события на сервере базы данных.A trigger is a special type of stored procedure that automatically runs when an event occurs in the database server. Триггеры DML выполняются, когда пользователь пытается изменить данные с помощью событий языка обработки данных (DML).DML triggers run when a user tries to modify data through a data manipulation language (DML) event. Событиями DML являются процедуры INSERT, UPDATE или DELETE, применяемые к таблице или представлению.DML events are INSERT, UPDATE, or DELETE statements on a table or view. Эти триггеры срабатывают при запуске любого допустимого события независимо от наличия и числа затронутых строк таблицы.These triggers fire when any valid event fires, whether table rows are affected or not. Дополнительные сведения см. в разделе DML Triggers.For more information, see DML Triggers.

Триггеры DDL активируются в ответ на разные события языка описания данных (DDL).DDL triggers run in response to a variety of data definition language (DDL) events. Эти события прежде всего соответствуют инструкциям Transact-SQLTransact-SQL CREATE, ALTER, DROP и некоторым системным хранимым процедурам, которые выполняют схожие с DDL операции.These events primarily correspond to Transact-SQLTransact-SQL CREATE, ALTER, and DROP statements, and certain system stored procedures that perform DDL-like operations.

Триггеры входа могут срабатывать в ответ на событие LOGON, которое возникает при создании пользовательского сеанса.Logon triggers fire in response to the LOGON event that's raised when a user's session is being established. Вы можете создавать триггеры непосредственно из инструкций Transact-SQLTransact-SQL или методов сборок, созданных в среде CLR платформы MicrosoftMicrosoft .NET Framework.NET Framework и переданных в экземпляр SQL ServerSQL Server.You can create triggers directly from Transact-SQLTransact-SQL statements or from methods of assemblies that are created in the MicrosoftMicrosoft .NET Framework.NET Framework common language runtime (CLR) and uploaded to an instance of SQL ServerSQL Server. SQL ServerSQL Server позволяет создавать несколько триггеров для любой инструкции.lets you create multiple triggers for any specific statement.

Важно!

Вредоносный программный код внутри триггеров может быть запущен с расширенными правами доступа.Malicious code inside triggers can run under escalated privileges. Дополнительные сведения о том, как уменьшить эту угрозу, см. в статье Управление безопасностью триггеров.For more information on how to mitigate this threat, see Manage Trigger Security.

Примечание

В этой статье рассматривается интеграция среды CLR .NET Framework с SQL Server.The integration of .NET Framework CLR into SQL Server is discussed in this article. Интеграция со средой CLR не применяется к базе данных SQL Azure.CLR integration does not apply to Azure SQL Database.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  
  
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
[ WITH APPEND ]  
[ NOT FOR REPLICATION ]   
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }  
  
<dml_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
  
<method_specifier> ::=  
    assembly_name.class_name.method_name  
  
-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a 
-- table (DML Trigger on memory-optimized tables)  
  
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
AS { sql_statement  [ ; ] [ ,...n ] }  
  
<dml_trigger_option> ::=  
    [ NATIVE_COMPILATION ]  
    [ SCHEMABINDING ]  
    [ EXECUTE AS Clause ]  
  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE or UPDATE statement (DDL Trigger)  
  
CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { ALL SERVER | DATABASE }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type | event_group } [ ,...n ]  
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
  
<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
  
-- Trigger on a LOGON event (Logon Trigger)  
  
CREATE [ OR ALTER ] TRIGGER trigger_name   
ON ALL SERVER   
[ WITH <logon_trigger_option> [ ,...n ] ]  
{ FOR| AFTER } LOGON    
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
  
<logon_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
  

СинтаксисSyntax

-- Azure SQL Database Syntax   
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  
  
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
 [ WITH <dml_trigger_option> [ ,...n ] ]   
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
  AS { sql_statement  [ ; ] [ ,...n ] [ ; ] > }  
  
<dml_trigger_option> ::=   
        [ EXECUTE AS Clause ]  
  
-- Azure SQL Database Syntax  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE, or UPDATE STATISTICS statement (DDL Trigger)   
  
CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { DATABASE }   
 [ WITH <ddl_trigger_option> [ ,...n ] ]   
{ FOR | AFTER } { event_type | event_group } [ ,...n ]   
AS { sql_statement  [ ; ] [ ,...n ]  [ ; ] }  
  
<ddl_trigger_option> ::=   
    [ EXECUTE AS Clause ]  

АргументыArguments

OR ALTEROR ALTER
Область применения: Azure База данных SQLSQL Database, SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) с пакетом обновления 1 (SP1)).Applies to: Azure База данных SQLSQL Database, SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).

Условно изменяет триггер только в том случае, если он уже существует.Conditionally alters the trigger only if it already exists.

schema_nameschema_name
Имя схемы, которой принадлежит триггер DML.The name of the schema to which a DML trigger belongs. Действие триггеров DML ограничивается схемой той таблицы или того представления, для которых они созданы.DML triggers are scoped to the schema of the table or view on which they're created. Аргумент schema_name не может указываться для триггеров DDL или триггеров входа.schema_name can't be specified for DDL or logon triggers.

trigger_nametrigger_name
Имя триггера.The name of the trigger. Аргумент trigger_name должен соответствовать правилам для идентификаторов с одним дополнительным ограничением: trigger_name не может начинаться с символов # или ##.A trigger_name must follow the rules for identifiers, except that trigger_name can't start with # or ##.

table | viewtable | view
Таблица или представление, в котором выполняется триггер DML.The table or view on which the DML trigger runs. Эту таблицу или представление иногда называют таблицей триггера или представлением триггера соответственно.This table or view is sometimes referred to as the trigger table or trigger view. Указание уточненного имени таблицы или представления не является обязательным.Specifying the fully qualified name of the table or view is optional. Ссылку на представление можно использовать только в триггере INSTEAD OF.You can only reference a view by an INSTEAD OF trigger. Нельзя определить триггеры DML для локальной или глобальной временных таблиц.You can't define DML triggers on local or global temporary tables.

DATABASEDATABASE
Применяет область действия триггера DDL к текущей базе данных.Applies the scope of a DDL trigger to the current database. Если этот аргумент определен, триггер срабатывает всякий раз при возникновении в базе данных события типа event_type или event_group.If specified, the trigger fires whenever event_type or event_group occurs in the current database.

ALL SERVERALL SERVER
Область применения: SQL Server 2008SQL Server 2008 и более поздних версий.Applies to: SQL Server 2008SQL Server 2008 and later.

Применяет область действия триггера DDL или триггера входа к текущему серверу.Applies the scope of a DDL or logon trigger to the current server. Если этот аргумент определен, триггер срабатывает всякий раз при возникновении на текущем сервере события типа event_type или event_group.If specified, the trigger fires whenever event_type or event_group occurs anywhere in the current server.

WITH ENCRYPTIONWITH ENCRYPTION
Область применения: SQL Server 2008SQL Server 2008 и более поздних версий.Applies to: SQL Server 2008SQL Server 2008 and later.

Маскирует текст инструкции CREATE TRIGGER.Obscures the text of the CREATE TRIGGER statement. Использование параметра WITH ENCRYPTION не позволяет публиковать триггер как часть репликации SQL ServerSQL Server.Using WITH ENCRYPTION prevents the trigger from being published as part of SQL ServerSQL Server replication. Параметр WITH ENCRYPTION нельзя указать для триггеров CLR.WITH ENCRYPTION can't be specified for CLR triggers.

EXECUTE ASEXECUTE AS
Указывает контекст безопасности, в котором выполняется триггер.Specifies the security context under which the trigger is executed. Позволяет управлять учетной записью пользователя, используемой экземпляром SQL ServerSQL Server для проверки разрешений на любые объекты базы данных, ссылаемые триггером.Enables you to control which user account the instance of SQL ServerSQL Server uses to validate permissions on any database objects that are referenced by the trigger.

Этот параметр является обязательным для триггеров в таблицах, оптимизированных для памяти.This option is required for triggers on memory-optimized tables.

Дополнительные сведения см. в разделе Предложение EXECUTE AS (Transact-SQL).For more information, seeEXECUTE AS Clause (Transact-SQL).

NATIVE_COMPILATIONNATIVE_COMPILATION
Указывает, что триггер компилируется в собственном коде.Indicates that the trigger is natively compiled.

Этот параметр является обязательным для триггеров в таблицах, оптимизированных для памяти.This option is required for triggers on memory-optimized tables.

SCHEMABINDINGSCHEMABINDING
Гарантирует, что используемые триггером таблицы ну будут удалены или изменены.Ensures that tables referenced by a trigger can't be dropped or altered.

Этот параметр является обязательным для триггеров в таблицах, оптимизированных для памяти, и не поддерживается для триггеров в обычных таблицах.This option is required for triggers on memory-optimized tables and isn't supported for triggers on traditional tables.

FOR | AFTERFOR | AFTER
Значение FOR или AFTER указывает, что триггер DML срабатывает только после успешного запуска всех операций в инструкции SQL, по которой срабатывает триггер.FOR or AFTER specifies that the DML trigger fires only when all operations specified in the triggering SQL statement have launched successfully. Кроме того, до запуска триггера должны успешно завершиться все каскадные действия и проверки ограничений, на которые есть ссылки.All referential cascade actions and constraint checks must also succeed before this trigger fires.

Нельзя определить триггеры AFTER для представлений.You can't define AFTER triggers on views.

INSTEAD OFINSTEAD OF
Указывает, что триггер DML выполняется вместо инструкции SQL, по которой он срабатывает, то есть переопределяет действия запускающих инструкций.Specifies that the DML trigger launches instead of the triggering SQL statement, thus, overriding the actions of the triggering statements. Аргумент INSTEAD OF нельзя использовать для триггеров DDL или триггеров входа.You can't specify INSTEAD OF for DDL or logon triggers.

Для каждой инструкции INSERT, UPDATE или DELETE в таблице или представлении можно определить не более одного триггера INSTEAD OF.At most, you can define one INSTEAD OF trigger per INSERT, UPDATE, or DELETE statement on a table or view. Также вы можете определить представления представлений, указав для каждого их уровня собственный триггер INSTEAD OF.You can also define views on views where each view has its own INSTEAD OF trigger.

Триггеры INSTEAD OF нельзя определять для обновляемых представлений, которые используют параметр WITH CHECK OPTION.You can't define INSTEAD OF triggers on updatable views that use WITH CHECK OPTION. SQL ServerSQL Server Такое действие вызовет ошибку, если триггер INSTEAD OF добавляется к обновляемому представлению с параметром WITH CHECK OPTION.Doing so results in an error when an INSTEAD OF trigger is added to an updatable view WITH CHECK OPTION specified. Чтобы удалить этот параметр, выполните инструкцию ALTER VIEW перед определением триггера INSTEAD OF.You remove that option by using ALTER VIEW before defining the INSTEAD OF trigger.

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
Определяет инструкции изменения данных, при применении которых к таблице или представлению срабатывает триггер DML.Specifies the data modification statements that activate the DML trigger when it's tried against this table or view. Укажите хотя бы один вариант.Specify at least one option. В определении триггера разрешены любые сочетания вариантов в любом порядке.Use any combination of these options in any order in the trigger definition.

Для триггеров INSTEAD OF нельзя использовать параметр DELETE в таблицах со ссылочной связью, которая определяет каскадное действие ON DELETE.For INSTEAD OF triggers, you can't use the DELETE option on tables that have a referential relationship, specifying a cascade action ON DELETE. Аналогично параметр UPDATE недопустим в таблицах, у которых есть ссылочная связь с каскадным действием ON UPDATE.Similarly, the UPDATE option isn't allowed on tables that have a referential relationship, specifying a cascade action ON UPDATE.

WITH APPENDWITH APPEND
Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2008 R2SQL Server 2008 R2.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2008 R2SQL Server 2008 R2.

Указывает, что требуется добавить триггер существующего типа.Specifies that an additional trigger of an existing type should be added. Аргумент WITH APPEND нельзя использовать для триггеров INSTEAD OF и в тех случаях, когда явно указан триггер AFTER.WITH APPEND can't be used with INSTEAD OF triggers or if an AFTER trigger is explicitly stated. Для сохранения обратной совместимости аргумент WITH APPEND следует использовать только при указании параметра FOR без INSTEAD OF или AFTER.For backward compatibility, only use WITH APPEND when FOR is specified, without INSTEAD OF or AFTER. Нельзя указать WITH APPEND, если используется EXTERNAL NAME (то есть триггер является триггером CLR).You can't specify WITH APPEND if using EXTERNAL NAME (that is, if the trigger is a CLR trigger).

event_typeevent_type
Имя языкового события Transact-SQLTransact-SQL, запуск которого вызывает срабатывание триггера DDL.The name of a Transact-SQLTransact-SQL language event that, after launch, causes a DDL trigger to fire. Список событий, которые могут быть использованы в триггерах DDL, приведен в разделе DDL-события.Valid events for DDL triggers are listed in DDL Events.

event_groupevent_group
Имя стандартной группы языковых событий Transact-SQLTransact-SQL.The name of a predefined grouping of Transact-SQLTransact-SQL language events. Триггер DDL срабатывает после запуска любого языкового события Transact-SQLTransact-SQL, которое относится к группе event_group.The DDL trigger fires after launch of any Transact-SQLTransact-SQL language event that belongs to event_group. Список групп событий, которые могут быть использованы в триггерах DDL, приведен в разделе Группы DDL-событий.Valid event groups for DDL triggers are listed in DDL Event Groups.

После завершения инструкции CREATE TRIGGER параметр event_group работает в режиме макроса, добавляя охватываемые им типы события в представление каталога sys.trigger_events.After the CREATE TRIGGER has finished running, event_group also acts as a macro by adding the event types it covers to the sys.trigger_events catalog view.

NOT FOR REPLICATIONNOT FOR REPLICATION
Область применения: SQL Server 2008SQL Server 2008 и более поздних версий.Applies to: SQL Server 2008SQL Server 2008 and later.

Указывает, что триггер не должен выполняться, когда агент репликации изменяет настроенную для триггера таблицу.Indicates that the trigger shouldn't be run when a replication agent modifies the table that's involved in the trigger.

sql_statementsql_statement
Условия и действия триггера.The trigger conditions and actions. Условия триггера указывают дополнительные критерии, определяющие, какие события — DML, DDL или событие входа — вызывают выполнение триггера.Trigger conditions specify additional criteria that determine whether the tried DML, DDL, or logon events cause the trigger actions to be run.

Действия триггера, указанные в инструкциях языка Transact-SQLTransact-SQL, вступают в силу после попытки использования операции.The trigger actions specified in the Transact-SQLTransact-SQL statements go into effect when the operation is tried.

Триггеры могут содержать любое количество инструкций языка Transact-SQLTransact-SQL любого типа, за некоторыми исключениями.Triggers can include any number and type of Transact-SQLTransact-SQL statements, with exceptions. Дополнительные сведения см. в подразделе "Примечания".For more information, see Remarks. Триггеры предназначены для проверки или изменения данных при выполнении инструкций модификации или определения данных. Не следует возвращать из них данные пользователю.A trigger is designed to check or change data based on a data modification or definition statement; it should't return data to the user. Инструкции языка Transact-SQLTransact-SQL в составе триггера часто содержат выражения языка управления потоком.The Transact-SQLTransact-SQL statements in a trigger frequently include control-of-flow language.

Триггеры DML используют логические (концептуальные) таблицы deleted и inserted.DML triggers use the deleted and inserted logical (conceptual) tables. По своей структуре они подобны таблице, для которой определен триггер, то есть таблице, к которой применяется действие пользователя.They're structurally similar to the table on which the trigger is defined, that is, the table on which the user action is tried. В таблицах deleted и inserted содержатся старые или новые значения строк, которые могут быть изменены действиями пользователя.The deleted and inserted tables hold the old values or new values of the rows that may be changed by the user action. Например, для запроса всех значений таблицы deleted можно использовать инструкцию:For example, to retrieve all values in the deleted table, use:

SELECT * FROM deleted;  

Дополнительные сведения см. в разделе Использование таблиц inserted и deleted.For more information, see Use the inserted and deleted Tables.

Триггеры DDL и триггеры входа собирают сведения о запускающих событиях с помощью функции EVENTDATA (Transact-SQL).DDL and logon triggers capture information about the triggering event by using the EVENTDATA (Transact-SQL) function. Дополнительные сведения см. в разделе Использование функции EVENTDATA.For more information, see Use the EVENTDATA Function.

SQL ServerSQL Server позволяет обновлять столбцы типа text, ntext или image с помощью триггера INSTEAD OF для таблиц или представлений.allows the update of text, ntext, or image columns through the INSTEAD OF trigger on tables or views.

Важно!

Типы данных ntext, text и image будут исключены в следующей версии MicrosoftMicrosoftSQL ServerSQL Server.ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoftSQL ServerSQL Server. Следует избегать использования этих типов данных при новой разработке и запланировать изменение приложений, использующих их в настоящий момент.Avoid using these data types in new development work, and plan to modify applications that currently use them. Вместо них следует использовать типы данных nvarchar(max), varchar(max)и varbinary(max) .Use nvarchar(max), varchar(max), and varbinary(max) instead. Как триггеры AFTER, так и триггеры INSTEAD OF поддерживают данные типов varchar(MAX) , nvarchar(MAX) и varbinary(MAX) в таблицах inserted и deleted.Both AFTER and INSTEAD OF triggers support varchar(MAX), nvarchar(MAX), and varbinary(MAX) data in the inserted and deleted tables.

Для триггеров в таблицах, оптимизированных для памяти, единственной инструкцией sql_statement, разрешенной на верхнем уровне, является блок ATOMIC.For triggers on memory-optimized tables, the only sql_statement allowed at the top level is an ATOMIC block. В блоке ATOMIC допускается только T-SQL, разрешенный в процедурах, компилируемых в собственном коде.The T-SQL allowed inside the ATOMIC block is limited by the T-SQL allowed inside native procs.

< method_specifier > Применимо к: SQL Server 2008SQL Server 2008 и выше.< method_specifier > Applies to: SQL Server 2008SQL Server 2008 and later.

Указывает метод сборки для связывания с CLR-триггером.For a CLR trigger, specifies the method of an assembly to bind with the trigger. Этот метод не должен принимать аргументы и возвращать значения void.The method must take no arguments and return void. Аргумент class_name должен быть допустимым идентификатором SQL ServerSQL Server и существовать как класс в сборке с видимостью сборки.class_name must be a valid SQL ServerSQL Server identifier and must exist as a class in the assembly with assembly visibility. Если класс имеет имя, содержащее точки (.) для разделения частей пространства имен, имя класса должно быть заключено в квадратные скобки ([ ]) или двойные кавычки (" ").If the class has a namespace-qualified name that uses '.' to separate namespace parts, the class name must be delimited by using [ ] or " " delimiters. Класс не может быть вложенным.The class can't be a nested class.

Примечание

По умолчанию возможность SQL ServerSQL Server запускать код CLR отключена.By default, the ability of SQL ServerSQL Server to run CLR code is off. Можно создавать, изменять и удалять объекты базы данных, которые ссылаются на модули управляемого кода, но эти модули не будут выполнены в экземплярах SQL ServerSQL Server, если вы не включили параметр clr enabled с помощью процедуры sp_configure.You can create, modify, and drop database objects that reference managed code modules, but these references don't run in an instance of SQL ServerSQL Server unless the clr enabled Option is enabled by using sp_configure.

Примечания о триггерах DMLRemarks for DML Triggers

Триггеры DML часто используются для применения бизнес-правил и обеспечения целостности данных.DML triggers are frequently used for enforcing business rules and data integrity. В SQL ServerSQL Server декларативное ограничение ссылочной целостности обеспечивается инструкциями ALTER TABLE и CREATE TABLE.SQL ServerSQL Server provides declarative referential integrity (DRI) through the ALTER TABLE and CREATE TABLE statements. Но декларативное ограничение ссылочной целостности не обеспечивает ссылочную целостность между базами данных.However, DRI doesn't provide cross-database referential integrity. Ограничение ссылочной целостности подразумевает выполнение правил связи между первичными и внешними ключами таблиц.Referential integrity refers to the rules about the relationships between the primary and foreign keys of tables. Для обеспечения ограничений ссылочной целостности используйте в инструкциях ALTER TABLE и CREATE TABLE ограничения PRIMARY KEY и FOREIGN KEY.To enforce referential integrity, use the PRIMARY KEY and FOREIGN KEY constraints in ALTER TABLE and CREATE TABLE. Если ограничения распространяются на таблицу триггера, они проверяются после выполнения триггера INSTEAD OF, но до выполнения триггера AFTER.If constraints exist on the trigger table, they're checked after the INSTEAD OF trigger runs and before the AFTER trigger runs. Если будет обнаружено нарушение ограничений, для триггера INSTEAD OF выполняется откат, а триггер AFTER не срабатывает.If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger isn't fired.

Вы можете указать, какой триггер AFTER будет выполняться для таблицы первым, а какой последним, с помощью sp_settriggerorder.You can specify the first and last AFTER triggers to be run on a table by using sp_settriggerorder. Для таблицы можно определить только один первый и один последний триггер для каждой из операций INSERT, UPDATE и DELETE.You can specify only one first and one last AFTER trigger for each INSERT, UPDATE, and DELETE operation on a table. Если для таблицы определены другие триггеры AFTER, они выполняются в случайном порядке.If there are other AFTER triggers on the same table, they're randomly run.

Если инструкция ALTER TRIGGER изменяет первый или последний триггер, для него удаляется метка первого или последнего триггера и порядок сортировки нужно установить заново с помощью sp_settriggerorder.If an ALTER TRIGGER statement changes a first or last trigger, the first or last attribute set on the modified trigger is dropped, and you must reset the order value by using sp_settriggerorder.

Триггер AFTER выполняется только после того, как вызывающая срабатывание триггера инструкция SQL успешно выполняется.An AFTER trigger is run only after the triggering SQL statement has run successfully. Успешное выполнение также подразумевает завершение всех ссылочных каскадных действий и проверки ограничений, связанных с измененными или удаленными объектами.This successful execution includes all referential cascade actions and constraint checks associated with the object updated or deleted. Триггер AFTER не вызывает рекурсивное срабатывание триггера INSTEAD OF для той же таблицы.An AFTER does not recursively fire an INSTEAD OF trigger on the same table.

Если определенный для таблицы триггер INSTEAD OF выполняет в этой таблице какую-либо инструкцию, которая обычно приводит к срабатыванию триггера INSTEAD OF, этот триггер не вызывается рекурсивно.If an INSTEAD OF trigger defined on a table runs a statement against the table that would ordinarily fire the INSTEAD OF trigger again, the trigger isn't called recursively. Вместо этого инструкция обрабатывается так, как если бы у таблицы отсутствовал триггер INSTEAD OF и начинается последовательность применения ограничений и выполнения триггеров AFTER.Instead, the statement processes as if the table had no INSTEAD OF trigger and starts the chain of constraint operations and AFTER trigger executions. Для примера предположим, что для таблицы определен триггер INSTEAD OF INSERT.For example, if a trigger is defined as an INSTEAD OF INSERT trigger for a table. Этот триггер выполняет инструкцию INSERT в той же таблице, и в этом случае выполненная в триггере INSTEAD OF инструкция INSERT не приводит к новому срабатыванию триггера.And, the trigger runs an INSERT statement on the same table, the INSERT statement launched by the INSTEAD OF trigger doesn't call the trigger again. Выполняемая триггером команда INSERT начинает процесс применения ограничений и срабатывания всех триггеров AFTER INSERT, определенных для этой таблицы.The INSERT launched by the trigger starts the process of running constraint actions and firing any AFTER INSERT triggers defined for the table.

Если определенный для представления триггер INSTEAD OF выполняет по отношению к этому представлению какую-либо инструкцию, которая обычно приводит к срабатыванию триггера INSTEAD OF, триггер рекурсивно не вызывается.When an INSTEAD OF trigger defined on a view runs a statement against the view that would ordinarily fire the INSTEAD OF trigger again, it's not called recursively. Вместо этого инструкция выполняет изменение базовых таблиц, на которых основано представление.Instead, the statement is resolved as modifications against the base tables underlying the view. В данном случае определение представления должно удовлетворять всем ограничениям, установленным для обновляемых представлений.In this case, the view definition must meet all the restrictions for an updatable view. Определение обновляемых представлений см. в разделе Изменение данных через представление.For a definition of updatable views, see Modify Data Through a View.

Для примера предположим, что для представления определен триггер INSTEAD OF UPDATE.For example, if a trigger is defined as an INSTEAD OF UPDATE trigger for a view. Этот триггер выполняет инструкцию UPDATE в том же представлении, и в этом случае выполненная в триггере INSTEAD OF инструкция UPDATE не приводит к новому срабатыванию триггера.And, the trigger runs an UPDATE statement referencing the same view, the UPDATE statement launched by the INSTEAD OF trigger doesn't call the trigger again. Выполняемая в триггере инструкция UPDATE обрабатывает представление так, как если бы у него не было триггера INSTEAD OF.The UPDATE launched by the trigger is processed against the view as if the view didn't have an INSTEAD OF trigger. Столбцы, измененные с помощью инструкции UPDATE, должны принадлежать одной базовой таблице.The columns changed by the UPDATE must be resolved to a single base table. Каждая модификация базовой таблицы вызывает применение последовательности ограничений и взвод триггеров AFTER, определенных для данной таблицы.Each modification to an underlying base table starts the chain of applying constraints and firing AFTER triggers defined for the table.

Проверка действий инструкций UPDATE или INSERT на указанные столбцыTesting for UPDATE or INSERT Actions to Specific Columns

Триггер Transact-SQLTransact-SQL можно настроить для выполнения некоторых действий при изменении определенных столбцов в инструкциях UPDATE или INSERT.You can design a Transact-SQLTransact-SQL trigger to do certain actions based on UPDATE or INSERT modifications to specific columns. Используйте для этих целей в теле триггера конструкции UPDATE() или COLUMNS_UPDATED.Use UPDATE() or COLUMNS_UPDATED in the body of the trigger for this purpose. Конструкция UPDATE() проверяет действие инструкций UPDATE или INSERT на одном столбце.UPDATE() tests for UPDATE or INSERT attempts on one column. COLUMNS_UPDATED проверяет выполнение операций UPDATE или INSERT над множеством столбцов.COLUMNS_UPDATED tests for UPDATE or INSERT actions that run on multiple columns. Эта функция возвращает битовый шаблон с информацией о том, какие столбцы были вставлены или обновлены.This function returns a bit pattern that indicates which columns were inserted or updated.

Ограничения триггеровTrigger Limitations

Инструкция CREATE TRIGGER должна быть первой инструкцией в пакете и может применяться только к одной таблице.CREATE TRIGGER must be the first statement in the batch and can apply to only one table.

Триггер создается только в текущей базе данных, но может, тем не менее, содержать ссылки на объекты за пределами текущей базы данных.A trigger is created only in the current database; however, a trigger can reference objects outside the current database.

Если для уточнения триггера указано имя схемы, имя таблицы необходимо уточнить таким же образом.If the trigger schema name is specified to qualify the trigger, qualify the table name in the same way.

Одно и то же действие триггера может быть определено более чем для одного действия пользователя (например, INSERT и UPDATE) в одной и той же инструкции CREATE TRIGGER.The same trigger action can be defined for more than one user action (for example, INSERT and UPDATE) in the same CREATE TRIGGER statement.

Триггеры INSTEAD OF DELETE и INSTEAD OF UPDATE нельзя определить для таблицы, у которой есть внешний ключ с каскадным действием для операции DELETE или UPDATE.INSTEAD OF DELETE/UPDATE triggers can't be defined on a table that has a foreign key with a cascade on DELETE/UPDATE action defined.

Внутри триггера может быть использована любая инструкция SET.Any SET statement can be specified inside a trigger. Выбранный параметр SET остается в силе во время выполнения триггера, после чего настройки возвращаются в предыдущее состояние.The SET option selected remains in effect during the execution of the trigger and then reverts to its former setting.

Во время срабатывания триггера результаты возвращаются вызывающему приложению так же, как и в случае с хранимыми процедурами.When a trigger fires, results are returned to the calling application, just like with stored procedures. Чтобы при срабатывании триггера в приложение не возвращались результаты, не включайте в триггер инструкции SELECT, которые возвращают результаты или инструкции присвоения переменных.To prevent results being returned to an application because of a trigger firing, don't include either SELECT statements that return results or statements that carry out variable assignment in a trigger. Если триггер содержит инструкции SELECT, которые возвращают результаты пользователю, либо инструкции присвоения значения переменным, для него требуется особый подход.A trigger that includes either SELECT statements that return results to the user or statements that do variable assignment, requires special handling. Возвращаемые результаты нужно будет передать в каждое приложение, которому разрешено изменять таблицу триггера.You'd have to write the returned results into every application in which modifications to the trigger table are allowed. Если в триггере происходит присвоение переменной, следует использовать инструкцию SET NOCOUNT в начале триггера, чтобы предотвратить возвращение каких-либо результирующих наборов.If variable assignment must occur in a trigger, use a SET NOCOUNT statement at the start of the trigger to prevent the return of any result sets.

Хотя инструкция TRUNCATE TABLE по сути аналогичная инструкции DELETE, она не активирует триггер, так как не заносит в журнал удаление отдельных строк.Although a TRUNCATE TABLE statement is in effect a DELETE statement, it doesn't activate a trigger because the operation doesn't log individual row deletions. Но беспокоиться о случайном обходе триггера DELETE таким образом нужно только пользователям с разрешениями на выполнение инструкции TRUNCATE TABLE.However, only those users with permissions to run a TRUNCATE TABLE statement need be concerned about inadvertently circumventing a DELETE trigger this way.

Инструкция WRITETEXT (с ведением журнала и без него) не запускает триггеры.The WRITETEXT statement, whether logged or unlogged, doesn't activate a trigger.

Следующие инструкции языка Transact-SQLTransact-SQL не разрешены в триггерах DML:The following Transact-SQLTransact-SQL statements aren't allowed in a DML trigger:

ALTER DATABASEALTER DATABASE CREATE DATABASECREATE DATABASE DROP DATABASEDROP DATABASE
RESTORE DATABASERESTORE DATABASE RESTORE LOGRESTORE LOG RECONFIGURERECONFIGURE

Кроме того, не допускается использование перечисленных ниже инструкций Transact-SQLTransact-SQL в тексте триггера DML, если он применяется к таблице или представлению, которые являются целью действий триггера.Additionally, the following Transact-SQLTransact-SQL statements aren't allowed inside the body of a DML trigger when it's used against the table or view that's the target of the triggering action.

CREATE INDEX (в т.ч CREATE SPATIAL INDEX и CREATE XML INDEX)CREATE INDEX (including CREATE SPATIAL INDEX and CREATE XML INDEX) ALTER INDEXALTER INDEX DROP INDEXDROP INDEX
DBCC DBREINDEXDBCC DBREINDEX ALTER PARTITION FUNCTIONALTER PARTITION FUNCTION DROP TABLEDROP TABLE
ALTER TABLE, если используется в следующих целях:ALTER TABLE when used to do the following:

Добавление, изменение или удаление столбцов.Add, modify, or drop columns.

Переключение секций.Switch partitions.

Добавление или удаление ограничений PRIMARY KEY и UNIQUE.Add or drop PRIMARY KEY or UNIQUE constraints.

Примечание

Поскольку SQL ServerSQL Server не поддерживает пользовательских триггеров в системных таблицах, рекомендуется не создавать пользовательские триггеры для системных таблиц.Because SQL ServerSQL Server does not support user-defined triggers on system tables, we recommend that you do not create user-defined triggers on system tables.

Оптимизация триггеров DMLOptimizing DML Triggers

Триггеры работают в транзакциях (в том числе неявных) и блокируют ресурсы на весь период, в течение которого транзакция открыта.Triggers work in transactions (implied or otherwise) and while they're open, they lock resources. Такая блокировка действует, пока транзакция не будет зафиксирована (COMMIT) или отклонена (ROLLBACK).The lock remains in place until the transaction is confirmed (with COMMIT) or rejected (with a ROLLBACK). Чем дольше выполняется триггер, тем выше вероятность блокирования другого процесса.The longer a trigger runs, the higher the probability that another process is then blocked. Старайтесь создавать такие триггеры, которые выполняются максимально быстро.So, write triggers to lessen their duration whenever possible. Один из способов сократить время выполнения — освободить триггер, если инструкция DML изменяет 0 строк.One way to achieve shorter duration is to release a trigger when a DML statement changes zero rows.

Чтобы освободить триггер для команды, которая не изменяет ни одной строки, используйте системную переменную ROWCOUNT_BIG.To release the trigger for a command that doesn't change any rows, employ the system variable ROWCOUNT_BIG.

В следующем фрагменте кода T-SQL триггер освобождается для команды, которая не изменяет ни одной строки.The following T-SQL code snippet shows how to release the trigger for a command that doesn't change any rows. Этот код нужно добавить в начале каждого триггера DML:This code should be present at the beginning of each DML trigger:

IF (ROWCOUNT_BIG() = 0)
RETURN;

Примечания о триггерах DDLRemarks for DDL Triggers

Триггеры DDL, как и стандартные триггеры, запускают хранимые процедуры в ответ на какое-либо событие.DDL triggers, like standard triggers, launch stored procedures in response to an event. В отличие от стандартных триггеров, они не срабатывают при выполнении инструкций UPDATE, INSERT или DELETE для таблицы или представления.But, unlike standard triggers, they don't run in response to UPDATE, INSERT, or DELETE statements on a table or view. Вместо этого они обычно срабатывают в ответ на инструкции языка определения данных (DDL).Instead, they primarily run in response to data definition language (DDL) statements. К ним относятся инструкции CREATE, ALTER, DROP, GRANT, DENY, REVOKE и UPDATE STATISTICS.The statement types include CREATE, ALTER, DROP, GRANT, DENY, REVOKE, and UPDATE STATISTICS. Системные хранимые процедуры, выполняющие операции, подобные операциям DDL, также могут запускать триггеры DDL.Certain system stored procedures that carry out DDL-like operations can also fire DDL triggers.

Важно!

Протестируйте триггеры DDL, чтобы получить ответ на выполнение системных хранимых процедур.Test your DDL triggers to determine their responses to system stored procedure execution. Например, инструкция CREATE TYPE и хранимые процедуры sp_addtype и sp_rename вызовут срабатывание триггера DDL, созданного для события CREATE_TYPE.For example, the CREATE TYPE statement and the sp_addtype and sp_rename stored procedures fire a DDL trigger that's created on a CREATE_TYPE event.

Дополнительные сведения о триггерах DDL см. в разделе Триггеры DDL.For more information about DDL triggers, see DDL Triggers.

Триггеры DDL не срабатывают в ответ на события, влияющие на локальные или глобальные временные таблицы и хранимые процедуры.DDL triggers don't fire in response to events that affect local or global temporary tables and stored procedures.

В отличие от триггеров DML, триггеры DDL не ограничены областью схемы.Unlike DML triggers, DDL triggers aren't scoped to schemas. Это означает, что для запроса метаданных о триггерах DDL нельзя воспользоваться такими функциями, как OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY и OBJECTPROPERTYEX.So, you can't use functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX for querying metadata about DDL triggers. Используйте вместо них представления каталога.Use the catalog views instead. Дополнительные сведения см. в статье Получение сведений о триггерах DDL.For more information, see Get Information About DDL Triggers.

Примечание

Триггеры DDL сервера находятся в папке Триггеры обозревателя объектов среды SQL Server Management StudioSQL Server Management Studio.Server-scoped DDL triggers appear in the SQL Server Management StudioSQL Server Management Studio Object Explorer in the Triggers folder. Эта папка находится под папкой Объекты сервера .This folder is located under the Server Objects folder. Триггеры DDL, доступные в области базы данных, находятся в папке Триггеры базы данных.Database-scoped DDL Triggers appear in the Database Triggers folder. Эта папка находится в папке Программирование соответствующей базы данных.This folder is located under the Programmability folder of the corresponding database.

Триггеры входаLogon Triggers

Триггеры входа выполняют хранимые процедуры в ответ на событие LOGON.Logon triggers carry out stored procedures in response to a LOGON event. Это событие вызывается, когда для пользователя создается сеанс в экземпляре SQL ServerSQL Server.This event happens when a user session is established with an instance of SQL ServerSQL Server. Триггеры входа срабатывают после проверки подлинности при входе, но перед тем, как устанавливается пользовательский сеанс.Logon triggers fire after the authentication phase of logging in finishes, but before the user session is established. Таким образом, все созданные внутри триггера сообщения, которые обычно передаются пользователю (например, сообщения об ошибках и сообщения от инструкции PRINT), перенаправляются в журнал ошибок SQL ServerSQL Server.So, all messages originating inside the trigger that would typically reach the user, such as error messages and messages from the PRINT statement, are diverted to the SQL ServerSQL Server error log. Дополнительные сведения см. в разделе Триггеры входа.For more information, see Logon Triggers.

Если проверка подлинности завершается сбоем, триггеры входа не срабатывают.Logon triggers don't fire if authentication fails.

Распределенные транзакции не поддерживаются в триггерах входа.Distributed transactions aren't supported in a logon trigger. Если триггер содержит распределенную транзакцию, при его срабатывании возвращается ошибка 3969.Error 3969 returns when a logon trigger that contains a distributed transaction fire.

Отключение триггера входаDisabling a Logon Trigger

Триггер входа может эффективно запрещать подключения к службам Компонент Database EngineDatabase Engine для всех пользователей, в том числе членов предопределенной роли сервера sysadmin .A logon trigger can effectively prevent successful connections to the Компонент Database EngineDatabase Engine for all users, including members of the sysadmin fixed server role. Если триггер входа запрещает соединения, члены предопределенной роли сервера sysadmin могут подключаться с помощью выделенного административного соединения или путем вызова Компонент Database EngineDatabase Engine в режиме минимальной конфигурации (-f).When a logon trigger is preventing connections, members of the sysadmin fixed server role can connect by using the dedicated administrator connection, or by starting the Компонент Database EngineDatabase Engine in minimal configuration mode (-f). Дополнительные сведения см. в разделе Параметры запуска службы Database Engine.For more information, see Database Engine Service Startup Options.

Общие соглашения о триггерахGeneral Trigger Considerations

Возвращаемые результатыReturning Results

Возможность возвращать результаты из триггеров будет исключена из следующей версии SQL Server.The ability to return results from triggers will be removed in a future version of SQL Server. Триггеры, которые возвращают результирующие наборы, могут привести к непредвиденному поведению в приложениях, не предназначенных для работы с ними.Triggers that return result sets may cause unexpected behavior in applications that aren't designed to work with them. Старайтесь не возвращать результирующие наборы из триггеров во всех новых проектах и постепенно исправляйте такое поведение в существующих приложениях.Avoid returning result sets from triggers in new development work, and plan to modify applications that currently do. Чтобы триггеры не возвращали результирующие наборы, для параметра disallow results from triggers необходимо установить значение 1.To prevent triggers from returning result sets, set the disallow results from triggers option to 1.

Триггеры входа всегда запрещают возврат результирующих наборов, и это нельзя изменить.Logon triggers always disallow the return of results sets and this behavior isn't configurable. Если триггер входа формирует результирующий набор, его не удастся запустить и любая попытка входа, при которой срабатывает такой триггер, будет запрещена.If a logon trigger generates a result set, the trigger fails to launch and the login attempt that fired the trigger is denied.

Несколько триггеровMultiple Triggers

SQL ServerSQL Server позволяет создавать несколько триггеров для каждого события DML, DDL или LOGON.lets you create multiple triggers for each DML, DDL, or LOGON event. Например, если CREATE TRIGGER FOR UPDATE выполняется для таблицы, которая уже имеет триггер UPDATE, будет создан дополнительный триггер для обновлений.For example, if CREATE TRIGGER FOR UPDATE is run for a table that already has an UPDATE trigger, an additional update trigger is created. В более ранних версиях SQL ServerSQL Server был разрешен только один триггер в каждой таблице для каждого события изменения данных INSERT, UPDATE или DELETE.In earlier versions of SQL ServerSQL Server, only one trigger for each INSERT, UPDATE, or DELETE data modification event is allowed for each table.

Рекурсивные триггерыRecursive Triggers

SQL ServerSQL Server также поддерживает рекурсивный вызов триггеров, если вы включите параметр RECURSIVE_TRIGGERS с помощью инструкции ALTER DATABASE.also supports recursive invocation of triggers when the RECURSIVE_TRIGGERS setting is enabled using ALTER DATABASE.

В рекурсивных триггерах могут возникать следующие типы рекурсии:Recursive triggers enable the following types of recursion to occur:

  • Косвенная рекурсияIndirect recursion

    При косвенной рекурсии приложение обновляет таблицу T1.With indirect recursion, an application updates table T1. Это событие вызывает срабатывание триггера TR1, обновляющего таблицу T2.This fires trigger TR1, updating table T2. Затем срабатывает триггер T2, который обновляет таблицу T1.Trigger T2 then fires and updates table T1.

  • Прямая рекурсияDirect recursion

    При прямой рекурсии приложение обновляет таблицу T1.In direct recursion, the application updates table T1. Это событие вызывает срабатывание триггера TR1, обновляющего таблицу T1.This fires trigger TR1, updating table T1. Поскольку таблица T1 уже была обновлена, триггер TR1 срабатывает снова и т. д.Because table T1 was updated, trigger TR1 fires again, and so on.

В следующем примере используются оба типа рекурсий: прямая и косвенная. Допустим, для таблицы T1 определены два триггера: TR1 и TR2.The following example uses both indirect and direct trigger recursion Assume that two update triggers, TR1 and TR2, are defined on table T1. Триггер TR1 рекурсивно обновляет таблицу T1.Trigger TR1 updates table T1 recursively. Инструкция UPDATE выполняет TR1 и TR2 по одному разу.An UPDATE statement runs each TR1 and TR2 one time. Кроме того, запуск TR1 вызывает выполнение триггеров TR1 (рекурсивно) и TR2.Additionally, the launch of TR1 triggers the execution of TR1 (recursively) and TR2. В таблицах inserted и deleted триггера содержатся строки, которые относятся только к инструкции UPDATE, вызвавшей срабатывание триггера.The inserted and deleted tables for a specific trigger contain rows that correspond only to the UPDATE statement that invoked the trigger.

Примечание

Описанная ситуация имеет место только в том случае, если настройка RECURSIVE_TRIGGERS включена с помощью инструкции ALTER DATABASE.The previous behavior occurs only if the RECURSIVE_TRIGGERS setting is enabled by using ALTER DATABASE. Не существует определенного порядка для выполнения нескольких триггеров, определенных для одного события.There's no defined order in which multiple triggers defined for a specific event are run. Каждый триггер должен быть самодостаточным.Each trigger should be self-contained.

Отключение настройки RECURSIVE_TRIGGERS предотвращает выполнение только прямых рекурсий.Disabling the RECURSIVE_TRIGGERS setting only prevents direct recursions. Чтобы отключить косвенную рекурсию, с помощью хранимой процедуры sp_configure присвойте параметру сервера nested triggers значение 0.To disable indirect recursion also, set the nested triggers server option to 0 by using sp_configure.

Если один из триггеров (независимо от уровня вложенности) выполняет инструкцию ROLLBACK TRANSACTION, никакие другие триггеры не выполняются.If any one of the triggers carries out a ROLLBACK TRANSACTION, regardless of the nesting level, no more triggers are run.

Вложенные триггерыNested Triggers

Для триггеров допускается не более 32 уровней вложенности.You can nest triggers to a maximum of 32 levels. Если триггер изменяет таблицу, для которой определен другой триггер, активируется этот второй триггер. Он может, в свою очередь, вызвать третий триггер и так далее.If a trigger changes a table on which there's another trigger, the second trigger activates and can then call a third trigger, and so on. Если любой из триггеров в цепочке отключает бесконечный цикл, то уровень вложенности превышает допустимый предел, и срабатывание триггера отменяется.If any trigger in the chain sets off an infinite loop, the nesting level is exceeded and the trigger is canceled. Когда триггер Transact-SQLTransact-SQL запускает управляемый код ссылкой на подпрограмму CLR, тип, или статистическое выражение, такая ссылка считается одним из 32 допустимых уровней вложенности.When a Transact-SQLTransact-SQL trigger launches managed code by referencing a CLR routine, type, or aggregate, this reference counts as one level against the 32-level nesting limit. Это ограничение не распространяется на методы, вызываемые из управляемого кода.Methods invoked from within managed code don't count against this limit.

Чтобы отменить вложенные триггеры, присвойте значение 0 параметру nested triggers хранимой процедуры sp_configure.To disable nested triggers, set the nested triggers option of sp_configure to 0 (off). Конфигурация по умолчанию поддерживает вложенные триггеры.The default configuration supports nested triggers. Если вложенные триггеры отключены, отключаются и рекурсивные триггеры, независимо от значения RECURSIVE_TRIGGERS, которое установлено с помощью инструкции ALTER DATABASE.If nested triggers are off, recursive triggers are also disabled, despite the RECURSIVE_TRIGGERS setting that's set by using ALTER DATABASE.

Первый триггер AFTER, вложенный в триггер INSTEAD OF, срабатывает даже в том случае, если для сервера настроен нулевой уровень вложенных триггеров.The first AFTER trigger nested inside an INSTEAD OF trigger fires even if the nested triggers server configuration option is 0. Но в таком случае остальные триггеры AFTER не сработают.But, under this setting, the later AFTER triggers don't fire. Проверьте все приложения на наличие вложенных триггеров, чтобы определить соблюдение бизнес-правил, прежде чем устанавливать значение 0 для параметра nested triggers (вложенные триггеры).Review your applications for nested triggers to determine if the applications follow your business rules when the nested triggers server configuration option is set to 0. Если правила не соблюдаются, внесите соответствующие изменения.If not, make the appropriate modifications.

Отложенная интерпретация именDeferred Name Resolution

SQL ServerSQL Server позволяет добавлять в хранимые процедуры, триггеры и пакеты Transact-SQLTransact-SQL ссылки на таблицы, которые не существуют во время компиляции.allows for Transact-SQLTransact-SQL stored procedures, triggers, and batches to refer to tables that don't exist at compile time. Такая возможность называется отложенной интерпретацией имен.This ability is called deferred name resolution.

РазрешенияPermissions

Чтобы создать триггер DML, ему нужно разрешение ALTER для таблицы или представления, для которых создается этот триггер.To create a DML trigger, it requires ALTER permission on the table or view on which the trigger is being created.

Чтобы создать триггер DDL в области сервера (ON ALL SERVER) или триггера входа, требуется разрешение CONTROL SERVER для этого сервера.To create a DDL trigger with server scope (ON ALL SERVER) or a logon trigger, requires CONTROL SERVER permission on the server. Чтобы создать триггер DDL в области базы данных (ON DATABASE), требуется разрешение ALTER ANY DATABASE DDL TRIGGER для текущей базы данных.To create a DDL trigger with database scope (ON DATABASE), requires ALTER ANY DATABASE DDL TRIGGER permission in the current database.

ПримерыExamples

A.A. Использование триггера DML с предупреждающим сообщениемUsing a DML trigger with a reminder message

Следующий триггер DML отправляет клиенту сообщение, когда кто-то пытается добавить или изменить данные в таблице Customer в базе данных AdventureWorks2012AdventureWorks2012.The following DML trigger prints a message to the client when anyone tries to add or change data in the Customer table in the AdventureWorks2012AdventureWorks2012 database.

CREATE TRIGGER reminder1  
ON Sales.Customer  
AFTER INSERT, UPDATE   
AS RAISERROR ('Notify Customer Relations', 16, 10);  
GO  

Б.B. Использование триггера DML с предупреждающим сообщением, отправляемым по электронной почтеUsing a DML trigger with a reminder e-mail message

В следующем примере указанному пользователю (MaryM) по электронной почте отправляется сообщение при изменении таблицы Customer.The following example sends an e-mail message to a specified person (MaryM) when the Customer table changes.

CREATE TRIGGER reminder2  
ON Sales.Customer  
AFTER INSERT, UPDATE, DELETE   
AS  
   EXEC msdb.dbo.sp_send_dbmail  
        @profile_name = 'AdventureWorks2012 Administrator',  
        @recipients = 'danw@Adventure-Works.com',  
        @body = 'Don''t forget to print a report for the sales force.',  
        @subject = 'Reminder';  
GO  

В.C. Использование триггера DML AFTER для принудительного применения бизнес-правил между таблицами PurchaseOrderHeader и VendorUsing a DML AFTER trigger to enforce a business rule between the PurchaseOrderHeader and Vendor tables

Так ограничения CHECK ссылаются только на столбцы, для которых определено ограничение на уровне таблицы или столбца, все межтабличные ограничения (в нашем примере это бизнес-правила) следует определять как триггеры.Because CHECK constraints reference only the columns on which the column-level or table-level constraint is defined, you must define any cross-table constraints (in this case, business rules) as triggers.

В следующем примере создается триггер DML в базе данных AdventureWorks 2012.The following example creates a DML trigger in the AdventureWorks2012 database. Этот триггер проверяет оценку кредитоспособности для поставщика (оценка не равна 5) при попытке добавить новый заказ на покупку в таблицу PurchaseOrderHeader.This trigger checks to make sure the credit rating for the vendor is good (not 5) when there's an attempt to insert a new purchase order into the PurchaseOrderHeader table. Чтобы получить оценку кредитоспособности поставщика, требуется ссылка на таблицу Vendor.To get the credit rating of the vendor, the Vendor table must be referenced. Если рейтинг кредитоспособности слишком низок, поступает сообщение об этом и вставка не выполняется.If the credit rating is too low, a message appears and the insertion doesn't happen.

-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader 
-- table when the credit rating of the specified vendor is set to 5 (below average).  
  
CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader  
AFTER INSERT  
AS  
IF (ROWCOUNT_BIG() = 0)
RETURN;
IF EXISTS (SELECT *  
           FROM Purchasing.PurchaseOrderHeader AS p   
           JOIN inserted AS i   
           ON p.PurchaseOrderID = i.PurchaseOrderID   
           JOIN Purchasing.Vendor AS v   
           ON v.BusinessEntityID = p.VendorID  
           WHERE v.CreditRating = 5  
          )  
BEGIN  
RAISERROR ('A vendor''s credit rating is too low to accept new  
purchase orders.', 16, 1);  
ROLLBACK TRANSACTION;  
RETURN   
END;  
GO  
  
-- This statement attempts to insert a row into the PurchaseOrderHeader table  
-- for a vendor that has a below average credit rating.  
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.  
  
INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,  
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)  
VALUES (  
2  
,3  
,261  
,1652  
,4  
,GETDATE()  
,GETDATE()  
,44594.55  
,3567.564  
,1114.8638 );  
GO  
  

Г.D. Использование триггера DDL уровня базы данныхUsing a database-scoped DDL trigger

В следующем примере триггер DDL используется для предотвращения удаления синонимов в базе данных.The following example uses a DDL trigger to prevent any synonym in a database from being dropped.

CREATE TRIGGER safety   
ON DATABASE   
FOR DROP_SYNONYM  
AS   
IF (@@ROWCOUNT = 0)
RETURN;
   RAISERROR ('You must disable Trigger "safety" to remove synonyms!', 10, 1)  
   ROLLBACK  
GO  
DROP TRIGGER safety  
ON DATABASE;  
GO  

Д.E. Использование триггера DDL уровня сервераUsing a server-scoped DDL trigger

В следующем примере триггер DDL используется для вывода сообщения при возникновении на данном экземпляре сервера любого из событий CREATE DATABASE, а функция EVENTDATA используется для получения текста соответствующей инструкции на языке Transact-SQLTransact-SQL.The following example uses a DDL trigger to print a message if any CREATE DATABASE event occurs on the current server instance, and uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. Примеры использования функции EVENTDATA в триггерах DDL см. в разделе Использование функции EVENTDATA.For more examples that use EVENTDATA in DDL triggers, see Use the EVENTDATA Function.

Область применения: SQL Server 2008SQL Server 2008 и более поздних версий.Applies to: SQL Server 2008SQL Server 2008 and later.

CREATE TRIGGER ddl_trig_database   
ON ALL SERVER   
FOR CREATE_DATABASE   
AS   
    PRINT 'Database Created.'  
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  
GO  
DROP TRIGGER ddl_trig_database  
ON ALL SERVER;  
GO  

Е.F. Использование триггера входаUsing a logon trigger

В следующем примере триггера входа выполняется запрет попытки подключения к SQL ServerSQL Server в качестве члена имени входа login_test, если для этого имени входа уже запущено три сеанса.The following logon trigger example denies an attempt to log in to SQL ServerSQL Server as a member of the login_test login if there are already three user sessions running under that login.

Область применения: SQL Server 2008SQL Server 2008 и более поздних версий.Applies to: SQL Server 2008SQL Server 2008 and later.

USE master;  
GO  
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,  
    CHECK_EXPIRATION = ON;  
GO  
GRANT VIEW SERVER STATE TO login_test;  
GO  
CREATE TRIGGER connection_limit_trigger  
ON ALL SERVER WITH EXECUTE AS 'login_test'  
FOR LOGON  
AS  
BEGIN  
IF ORIGINAL_LOGIN()= 'login_test' AND  
    (SELECT COUNT(*) FROM sys.dm_exec_sessions  
            WHERE is_user_process = 1 AND  
                original_login_name = 'login_test') > 3  
    ROLLBACK;  
END;  
  

Ж.G. Просмотр событий, вызвавших срабатывание триггераViewing the events that cause a trigger to fire

В следующем примере выполняются запросы к представлениям каталога sys.triggers и sys.trigger_events с целью определения, какие события языка Transact-SQLTransact-SQL вызывали срабатывание триггера safety.The following example queries the sys.triggers and sys.trigger_events catalog views to determine which Transact-SQLTransact-SQL language events cause trigger safety to fire. Триггер safety, созданный в примере Г, приведен выше.The trigger, safety, is created in example 'D', found above.

SELECT TE.*  
FROM sys.trigger_events AS TE  
JOIN sys.triggers AS T ON T.object_id = TE.object_id  
WHERE T.parent_class = 0 AND T.name = 'safety';  
GO  

См. также:See Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
COLUMNS_UPDATED (Transact-SQL) COLUMNS_UPDATED (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL) ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
TRIGGER_NESTLEVEL (Transact-SQL) TRIGGER_NESTLEVEL (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.dm_sql_referenced_entities (Transact-SQL) sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL) sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL) sys.sql_expression_dependencies (Transact-SQL)
sp_help (Transact-SQL) sp_help (Transact-SQL)
sp_helptrigger (Transact-SQL) sp_helptrigger (Transact-SQL)
sp_helptext (Transact-SQL) sp_helptext (Transact-SQL)
sp_rename (Transact-SQL) sp_rename (Transact-SQL)
sp_settriggerorder (Transact-SQL) sp_settriggerorder (Transact-SQL)
UPDATE() (Transact-SQL) UPDATE() (Transact-SQL)
Получение сведений о триггерах DML Get Information About DML Triggers
Получение сведений о триггерах DDL Get Information About DDL Triggers
sys.triggers (Transact-SQL) sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL) sys.trigger_events (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
sys.server_triggers (Transact-SQL) sys.server_triggers (Transact-SQL)
sys.server_trigger_events (Transact-SQL) sys.server_trigger_events (Transact-SQL)
sys.server_sql_modules (Transact-SQL) sys.server_sql_modules (Transact-SQL)
sys.server_assembly_modules (Transact-SQL)sys.server_assembly_modules (Transact-SQL)