ALTER TRIGGER (Transact-SQL)

Изменяет определение триггера DML, DDL или триггера входа, созданного ранее инструкцией CREATE TRIGGER. Триггеры создаются при помощи инструкции CREATE TRIGGER. Они могут быть созданы непосредственно из инструкций Transact-SQL или методов сборок, созданных в среде CLR платформы Microsoft .NET Framework, и переданы на экземпляр SQL Server. Дополнительные сведения о параметрах, используемых в инструкции ALTER TRIGGER, см. в разделе CREATE TRIGGER (Transact-SQL).

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

Синтаксис

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 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

Аргументы

  • schema_name
    Имя схемы, которой принадлежит триггер DML. Триггеры DML применяются к схеме таблицы или представления, на которых они созданы. Указывать аргумент schema_name не обязательно только в случае, если триггер DML и соответствующая ему таблица или представление принадлежат к схеме по умолчанию. Аргумент schema_name не может быть указан для триггеров DDL или триггеров входа.

  • trigger_name
    Существующий триггер, подлежащий изменению.

  • table | view
    Таблица или представление, в котором выполняется триггер DML. Указывать полное имя таблицы или представления необязательно.

  • DATABASE
    Применяет область действия триггера DDL к текущей базе данных. Если этот аргумент определен, триггер срабатывает всякий раз при возникновении в базе данных события типа event_type или event_group.

  • ALL SERVER
    Применяет область действия триггера DDL или триггера входа к текущему серверу. Если этот аргумент определен, триггер срабатывает всякий раз при возникновении в любом месте на текущем сервере события типа event_type или event_group.

  • WITH ENCRYPTION
    Шифрует записи sys.syscomments sys.sql_modules, содержащие текст инструкции ALTER TRIGGER. Использование параметра WITH ENCRYPTION не позволяет публиковать триггер как часть репликации SQL Server. Параметр WITH ENCRYPTION не может быть указан для триггеров CLR.

    ПримечаниеПримечание

    Чтобы данный параметр остался активным, триггер, созданный с использованием инструкции WITH ENCRYPTION, должен быть определен повторно в инструкции ALTER TRIGGER.

  • EXECUTE AS
    Определяет контекст безопасности, в котором выполняется триггер. Позволяет управлять учетной записью пользователя, которая используется экземпляром SQL Server для проверки разрешений на любые объекты базы данных, на которые ссылается триггер.

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

  • AFTER
    Указывает, что этот триггер запускается только после того, как запускающая его инструкция SQL успешно выполнена. Все ссылочные каскадные действия и проверки ограничений также должны быть успешно выполнены перед запуском триггера.

    AFTER используется по умолчанию, если указано только ключевое слово FOR.

    Триггеры DML AFTER могут определяться только для таблиц.

  • INSTEAD OF
    Указывает, что триггер DML выполняется вместо запускающей инструкции SQL, переопределяя таким образом действия запускающих инструкций. Аргумент INSTEAD OF не может быть указан для триггеров DDL или триггеров входа.

    На каждую инструкцию INSERT, UPDATE или DELETE в таблице или представлении может быть определено не более одного триггера INSTEAD OF. Однако можно определять представления на базе представлений, у каждого из которых имеется собственный триггер INSTEAD OF.

    Триггеры INSTEAD OF не допускаются для представлений, созданных с использованием WITH CHECK OPTION. SQL Server вызывает ошибку, если триггер INSTEAD OF добавлен к представлению, для которого указано предложение WITH CHECK OPTION. Пользователь должен удалить этот параметр с помощью инструкции ALTER VIEW, прежде чем определить триггер INSTEAD OF.

  • { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }
    Задает инструкции изменения данных при применении к таблице или представлению, активирует триггер DML. Необходимо указать по крайней мере один параметр. В определении триггера разрешается любое сочетание этих параметров в любом порядке. Если указано больше одного параметра, параметры следует разделить запятыми.

    Для триггеров INSTEAD OF параметр DELETE не разрешен в таблицах, у которых есть ссылочная связь с указанием каскадного действия ON DELETE. Аналогично, параметр UPDATE не разрешен в таблицах, у которых есть ссылочная связь с указанием каскадного действия ON UPDATE. Дополнительные сведения см. в разделе ALTER TABLE (Transact-SQL).

  • event_type
    Имя языкового события Transact-SQL, которое после выполнения вызывает срабатывание триггера DDL. Список событий, которые могут быть использованы в триггерах DDL, приведен в разделе DDL-события.

  • event_group
    Имя стандартной группы событий языка Transact-SQL. Триггер DDL срабатывает по любому языковому событию Transact-SQL, принадлежащему к группе event_group. Список групп событий, которые могут быть использованы в триггерах DDL, приведен в разделе Группы DDL-событий. После завершения инструкции ALTER TRIGGER группа event_group также функционирует в качестве макроса, добавляя события соответствующих типов в представление каталога sys.trigger_events.

  • NOT FOR REPLICATION
    Указывает, что триггер не должен запускаться, когда агент репликации изменяет таблицу, связанную с триггером. Дополнительные сведения см. в разделе Управление ограничениями, идентификаторами и триггерами с помощью параметра «NOT FOR REPLICATION».

  • sql_statement
    Условия и действия триггера.

  • <method_specifier>
    Указывает метод сборки для привязки к триггеру. Метод не должен принимать аргументы и должен возвращать значение типа void. Идентификатор class_name должен быть допустимым идентификатором SQL Server и существовать как класс в сборке с видимостью сборки. Этот класс не может быть наследуемым классом.

Замечания

Дополнительные сведения об инструкции ALTER TRIGGER см. в подразделе «Примечания» раздела CREATE TRIGGER (Transact-SQL).

Триггеры DML

Инструкция ALTER TRIGGER поддерживает обновляемые вручную представления через триггеры INSTEAD OF для таблиц и представлений. В SQL Server ALTER TRIGGER применяется одинаково для триггеров всех видов (AFTER, INSTEAD-OF).

Первый и последний триггеры AFTER, которые должны быть выполнены в таблице, можно указать с помощью процедуры sp_settriggerorder. Для таблицы могут указываться только первый и последний триггеры AFTER. Если в той же таблице есть другие триггеры AFTER, они будут выполняться в произвольной последовательности.

Если инструкция ALTER TRIGGER меняет первый или последний триггер, первый или последний набор атрибутов измененного триггера удаляется, а порядок сортировки должен быть установлен заново с помощью процедуры sp_settriggerorder.

Триггер AFTER выполняется только после того, как вызывающая срабатывание триггера инструкция SQL была успешно выполнена. Успешное выполнение также подразумевает завершение всех ссылочных каскадных действий и проверки ограничений, связанных с измененными или удаленными объектами. Операция триггера AFTER проверяет влияние запускающей триггер инструкции, а также всех ссылочных каскадных действий UPDATE и DELETE, которые вызваны запускающей инструкцией.

Если действие DELETE по отношению к потомку или ссылающейся таблице является результатом действия CASCADE для инструкции DELETE из родительской таблицы, а для этой дочерней таблицы определен триггер INSTEAD OF для DELETE, то триггер не учитывается и выполняется действие DELETE.

Триггеры DDL

В отличие от триггеров DML, у триггеров DDL схемы не являются областью действия. Поэтому OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY и OBJECTPROPERTY(EX) не могут использоваться при запросах к метаданным о триггерах DDL. Используйте вместо них представления каталога. Дополнительные сведения см. в разделе Получение сведений о триггерах DDL.

Разрешения

Для изменения триггера DML требуется разрешение ALTER в таблице или представлении, в котором определен триггер.

Чтобы изменить триггер входа или триггер DDL, определенный в области сервера (ON ALL SERVER), требуется разрешение CONTROL SERVER на этом сервере. Чтобы изменить триггер DDL, определенный в области базы данных (ON DATABASE), требуется разрешение ALTER ANY DATABASE DDL TRIGGER в текущей базе данных.

Примеры

В следующем примере создается триггер DML, который выводит пользовательское сообщение клиенту, когда пользователь пытается добавить или изменить данные в таблице SalesPersonQuotaHistory. Затем триггер изменяется с использованием инструкции ALTER TRIGGER, чтобы применить триггер только к действиям INSERT. Этот триггер полезен, так как он напоминает пользователям, что при обновлениях и вставках строк в эту таблицу необходимо направить уведомление в подразделение Compensation.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N'Sales.bonus_reminder', N'TR') IS NOT NULL
    DROP TRIGGER Sales.bonus_reminder;
GO
CREATE TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
WITH ENCRYPTION
AFTER INSERT, UPDATE 
AS RAISERROR ('Notify Compensation', 16, 10);
GO
-- Now, change the trigger.
USE AdventureWorks2008R2;
GO
ALTER TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
AFTER INSERT
AS RAISERROR ('Notify Compensation', 16, 10);
GO

См. также

Справочник

Основные понятия