ALTER TRIGGER (Transact-SQL)

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

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (С первоначального выпуска по текущий выпуск).

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

Синтаксис

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

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

Аргументы

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

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

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

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

  • ALL SERVER

    Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

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

  • WITH ENCRYPTION

    Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

    Шифрует элементы 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

    Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

    Указывает, что триггер не должен запускаться, когда агент репликации изменяет таблицу, связанную с триггером.

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

  • EXTERNAL NAME <method_specifier>

    Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

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

Замечания

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

Примечание

Параметры EXTERNAL_NAME и ON_ALL_SERVER недоступны в автономной базе данных.

Триггеры 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.

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

В База данных SQL Windows Azure не поддерживаются триггеры на событиях имен входа.

Разрешения

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

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

Примеры

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

USE AdventureWorks2012;
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 AdventureWorks2012;
GO
ALTER TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
AFTER INSERT
AS RAISERROR ('Notify Compensation', 16, 10);
GO

См. также

Справочник

DROP TRIGGER (Transact-SQL)

ENABLE TRIGGER (Transact-SQL)

DISABLE TRIGGER (Transact-SQL)

EVENTDATA (Transact-SQL)

sp_helptrigger (Transact-SQL)

sp_addmergefilter (Transact-SQL)

sys.triggers (Transact-SQL)

sys.trigger_events (Transact-SQL)

sys.sql_modules (Transact-SQL)

sys.assembly_references (Transact-SQL)

sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)

sys.server_sql_modules (Transact-SQL)

sys.server_assembly_modules (Transact-SQL)

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

Создание хранимой процедуры

Transactions

Получение сведений о триггерах DML

Получение сведений о триггерах DDL

Внесение изменений схем в базы данных публикации