ALTER TRIGGER (Transact-SQL)ALTER 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

Изменяет определение триггера DML, DDL или триггера входа, созданного ранее инструкцией CREATE TRIGGER.Modifies the definition of a DML, DDL, or logon trigger that was previously created by the CREATE TRIGGER statement. Триггеры создаются при помощи инструкции CREATE TRIGGER.Triggers are created by using CREATE TRIGGER. Они могут быть созданы непосредственно из инструкций Transact-SQLTransact-SQL или методов сборок, созданных в среде CLR платформы MicrosoftMicrosoft .NET Framework.NET Framework, и переданы на экземпляр SQL ServerSQL Server.They can be created 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. Дополнительные сведения о параметрах, используемых в инструкции ALTER TRIGGER, см. в разделе CREATE TRIGGER (Transact-SQL).For more information about the parameters that are used in the ALTER TRIGGER statement, see CREATE TRIGGER (Transact-SQL).

Значок ссылки на раздел Синтаксические обозначения в 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)  

ALTER TRIGGER schema_name.trigger_name   
ON  ( table | view )   
[ WITH <dml_trigger_option> [ ,...n ] ]  
 ( FOR | AFTER | INSTEAD OF )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
[ 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  
  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table 
-- (DML Trigger on memory-optimized tables)  

ALTER TRIGGER schema_name.trigger_name   
ON  ( table  )   
[ WITH <dml_trigger_option> [ ,...n ] ]  
 ( FOR | AFTER )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
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)  
  
ALTER TRIGGER trigger_name   
ON { DATABASE | ALL SERVER }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type [ ,...n ] | event_group }   
AS { sql_statement [ ; ] | EXTERNAL NAME <method specifier>   
[ ; ] }  
}   
  
<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ <EXECUTE AS Clause> ]  
  
<method_specifier> ::=  
    assembly_name.class_name.method_name  
  
-- Trigger on a LOGON event (Logon Trigger)  

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

АргументыArguments

schema_nameschema_name
Имя схемы, которой принадлежит триггер DML.Is 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 are created. Аргумент schema**_name необязателен, только если триггер DML и соответствующая таблица или представление принадлежат схеме по умолчанию.schema**_name is optional only if the DML trigger and its corresponding table or view belong to the default schema. Аргумент schema_name не может указываться для триггеров DDL или триггеров входа.schema_name cannot be specified for DDL or logon triggers.

trigger_nametrigger_name
Существующий триггер, подлежащий изменению.Is the existing trigger to modify.

table | viewtable | view
Таблица или представление, в котором выполняется триггер DML.Is the table or view on which the DML trigger is executed. Указывать полное имя таблицы или представления необязательно.Specifying the fully-qualified name of the table or view is optional.

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.

Шифрует записи sys.syscomments sys.sql_modules, содержащие текст инструкции ALTER TRIGGER.Encrypts the sys.syscommentssys.sql_modules entries that contain the text of the ALTER 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 cannot be specified for CLR triggers.

Примечание

Чтобы данный параметр остался активным, триггер, созданный с использованием инструкции WITH ENCRYPTION, должен быть определен повторно в инструкции ALTER TRIGGER.If a trigger is created by using WITH ENCRYPTION, it must be specified again in the ALTER TRIGGER statement for this option to remain enabled.

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

Дополнительные сведения см. в разделе Предложение EXECUTE AS (Transact-SQL).For more information, see EXECUTE 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 that are referenced by a trigger cannot be dropped or altered.

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

AFTERAFTER
Указывает, что этот триггер запускается только после того, как запускающая его инструкция SQL успешно выполнена.Specifies that the trigger is fired only after the triggering SQL statement is executed successfully. Все ссылочные каскадные действия и проверки ограничений также должны быть успешно выполнены перед запуском триггера.All referential cascade actions and constraint checks also must have been successful before this trigger fires.

AFTER используется по умолчанию, если указано только ключевое слово FOR.AFTER is the default, if only the FOR keyword is specified.

Триггеры DML AFTER могут определяться только для таблиц.DML AFTER triggers may be defined only on tables.

INSTEAD OFINSTEAD OF
Указывает, что триггер DML выполняется вместо запускающей инструкции SQL, переопределяя таким образом действия запускающих инструкций.Specifies that the DML trigger is executed instead of the triggering SQL statement, therefore, overriding the actions of the triggering statements. Аргумент INSTEAD OF не может быть указан для триггеров DDL или триггеров входа.INSTEAD OF cannot be specified for DDL or logon triggers.

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

Использование триггеров INSTEAD OF не допускается в представлениях, созданных с использованием параметра WITH CHECK OPTION.INSTEAD OF triggers are not allowed on views created by using WITH CHECK OPTION. SQL ServerSQL Server вызывает ошибку, если триггер INSTEAD OF добавляется к представлению с параметром WITH CHECK OPTION.raises an error when an INSTEAD OF trigger is added to a view for which WITH CHECK OPTION was specified. Пользователь должен удалить этот параметр с помощью инструкции ALTER VIEW, прежде чем определить триггер INSTEAD OF.The user must remove that option using ALTER VIEW before defining the INSTEAD OF trigger.

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }
Задает инструкции изменения данных при применении к таблице или представлению, активирует триггер DML.Specifies the data modification statements, when tried against this table or view, activate the DML trigger. Необходимо указать как минимум одну инструкцию.At least one option must be specified. В определении триггера разрешается любое сочетание этих параметров в любом порядке.Any combination of these in any order is allowed in the trigger definition. Если указано больше одного параметра, параметры следует разделить запятыми.If more than one option is specified, separate the options with commas.

Для триггеров INSTEAD OF параметр DELETE не разрешен в таблицах, имеющих ссылочную связь с указанием каскадного действия ON DELETE.For INSTEAD OF triggers, the DELETE option is not allowed on tables that have a referential relationship specifying a cascade action ON DELETE. Аналогично, параметр UPDATE не разрешен в таблицах, у которых есть ссылочная связь с указанием каскадного действия ON UPDATE.Similarly, the UPDATE option is not allowed on tables that have a referential relationship specifying a cascade action ON UPDATE. Дополнительные сведения см. в разделе ALTER TABLE (Transact-SQL).For more information, see ALTER TABLE (Transact-SQL).

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

event_groupevent_group
Имя стандартной группы событий языка Transact-SQLTransact-SQL.Is the name of a predefined grouping of Transact-SQLTransact-SQL language events. Триггер DDL срабатывает после возникновения любого события языка Transact-SQLTransact-SQL, принадлежащего к группе event_group.The DDL trigger fires after execution 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. После завершения инструкции ALTER TRIGGER event_group также функционирует в качестве макроса, добавляя события соответствующих типов в представление каталога sys.trigger_events.After ALTER 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 should not be executed when a replication agent modifies the table involved in the trigger.

sql_statementsql_statement
Условия и действия триггера.Is the trigger conditions and actions.

Для триггеров в таблицах, оптимизированных для памяти, единственной инструкцией 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.

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

Указывает метод сборки для привязки к триггеру.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. Класс не может быть вложенным.The class cannot be a nested class.

ПримечанияRemarks

Дополнительные сведения об ALTER TRIGGER см. в подразделе "Замечания" раздела CREATE TRIGGER (Transact-SQL).For more information about ALTER TRIGGER, see Remarks in CREATE TRIGGER (Transact-SQL).

Примечание

Параметры EXTERNAL_NAME и ON_ALL_SERVER недоступны в автономной базе данных.The EXTERNAL_NAME and ON_ALL_SERVER options are not available in a contained database.

Триггеры DMLDML Triggers

Инструкция ALTER TRIGGER поддерживает обновляемые вручную представления через триггеры INSTEAD OF для таблиц и представлений.ALTER TRIGGER supports manually updatable views through INSTEAD OF triggers on tables and views. SQL ServerSQL Server применяет ALTER TRIGGER аналогично для всех видов триггеров (AFTER, INSTEAD-OF).applies ALTER TRIGGER the same way for all kinds of triggers (AFTER, INSTEAD-OF).

Первые и последние триггеры AFTER, которые будут выполнены в таблице, могут быть определены с использованием процедуры sp_settriggerorder.The first and last AFTER triggers to be executed on a table can be specified by using sp_settriggerorder. Для таблицы могут указываться только первый и последний триггеры AFTER.Only one first and one last AFTER trigger can be specified on a table. Если в таблице есть другие триггеры AFTER, они будут выполняться случайным образом.If there are other AFTER triggers on the same table, they are randomly executed.

Если инструкция 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 the order value must be reset by using sp_settriggerorder.

Триггер AFTER выполняется только после того, как вызывающая срабатывание триггера инструкция SQL была успешно выполнена.An AFTER trigger is executed only after the triggering SQL statement has executed successfully. Успешное выполнение также подразумевает завершение всех ссылочных каскадных действий и проверки ограничений, связанных с измененными или удаленными объектами.This successful execution includes all referential cascade actions and constraint checks associated with the object updated or deleted. Операция триггера AFTER проверяет влияние запускающей триггер инструкции, а также всех ссылочных каскадных действий UPDATE и DELETE, которые вызваны запускающей инструкцией.The AFTER trigger operation checks for the effects of the triggering statement and also all referential cascade UPDATE and DELETE actions that are caused by the triggering statement.

Если действие DELETE по отношению к потомку или ссылающейся таблице является результатом действия CASCADE для инструкции DELETE из родительской таблицы, а для этой дочерней таблицы определен триггер INSTEAD OF для DELETE, то триггер не учитывается и выполняется действие DELETE.When a DELETE action to a child or referencing table is the result of a CASCADE on a DELETE from the parent table, and an INSTEAD OF trigger on DELETE is defined on that child table, the trigger is ignored and the DELETE action is executed.

Триггеры DDLDDL Triggers

В отличие от триггеров DML, триггеры DDL не ограничены областью схемы.Unlike DML triggers, DDL triggers are not scoped to schemas. Поэтому OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY и OBJECTPROPERTY(EX) не могут использоваться при запросах к метаданным о триггерах DDL.Therefore, the OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTY(EX) cannot be used when querying metadata about DDL triggers. Используйте вместо них представления каталога.Use the catalog views instead. Дополнительные сведения см. в статье Получение сведений о триггерах DDL.For more information, see Get Information About DDL Triggers.

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

В База данных SQL AzureAzure SQL Database не поддерживаются триггеры на событиях имен входа.База данных SQL AzureAzure SQL Database does not support triggers on logon events.

РазрешенияPermissions

Для изменения триггера DML требуется разрешение ALTER в таблице или представлении, в котором определен триггер.To alter a DML trigger requires ALTER permission on the table or view on which the trigger is defined.

Чтобы изменить триггер входа или триггер DDL, определенный в области сервера (ON ALL SERVER), требуется разрешение CONTROL SERVER на этом сервере.To alter a DDL trigger defined 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 alter a DDL trigger defined with database scope (ON DATABASE) requires ALTER ANY DATABASE DDL TRIGGER permission in the current database.

ПримерыExamples

В следующем примере в базе данных AdventureWorks 2012 создается триггер DML, который выводит пользовательское сообщение клиенту, когда пользователь пытается добавить или изменить данные в таблице SalesPersonQuotaHistory.The following example creates a DML trigger in the AdventureWorks 2012 database, that prints a user-defined message to the client when a user tries to add or change data in the SalesPersonQuotaHistory table. Затем триггер изменяется с использованием инструкции ALTER TRIGGER, чтобы применить триггер только к действиям INSERT.The trigger is then modified by using ALTER TRIGGER to apply the trigger only on INSERT activities. Этот триггер полезен, так как он напоминает пользователям, что при обновлениях и вставках строк в эту таблицу необходимо направить уведомление в отдел Compensation.This trigger is helpful because it reminds the user that updates or inserts rows into this table to also notify the Compensation department.

CREATE TRIGGER Sales.bonus_reminder  
ON Sales.SalesPersonQuotaHistory  
WITH ENCRYPTION  
AFTER INSERT, UPDATE   
AS RAISERROR ('Notify Compensation', 16, 10);  
GO  

-- Now, change the trigger.  
ALTER TRIGGER Sales.bonus_reminder  
ON Sales.SalesPersonQuotaHistory  
AFTER INSERT  
AS RAISERROR ('Notify Compensation', 16, 10);  
GO  

См. такжеSee Also

DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL) ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sp_helptrigger (Transact-SQL) sp_helptrigger (Transact-SQL)
Создание хранимой процедуры Create a Stored Procedure
sp_addmessage (Transact-SQL) sp_addmessage (Transact-SQL)
Транзакции Transactions
Получение сведений о триггерах 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)
Внесение изменений в схемы баз данных публикацииMake Schema Changes on Publication Databases