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 AdventureWorks;
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 AdventureWorks;
GO

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

См. также

Справочник

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