Бөлісу құралы:


ALTER TRIGGER (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

Соглашения о синтаксисе 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 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> ]  

Аргументы

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 (10.0.x) и более поздних версий.

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

WITH ENCRYPTION
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

Шифрует записи 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).

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

Этот параметр является обязательным для триггеров в таблицах, оптимизированных для памяти.

SCHEMABINDING
Гарантирует, что таблицы, на которые ссылается триггер, нельзя удалить или изменить.

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

ПОСЛЕ
Указывает, что этот триггер запускается только после того, как запускающая его инструкция 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 срабатывает после возникновения любого относящегося к языку события, принадлежащего к группе event_group. Список групп событий, которые могут быть использованы в триггерах DDL, приведен в разделе Группы DDL-событий. После завершения инструкции ALTER TRIGGER event_group также функционирует в качестве макроса, добавляя события соответствующих типов в представление каталога sys.trigger_events.

NOT FOR REPLICATION
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

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

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

Для триггеров в таблицах, оптимизированных для памяти, единственной инструкцией sql_statement, разрешенной на верхнем уровне, является блок ATOMIC. В блоке ATOMIC допускается только T-SQL, разрешенный в процедурах, компилируемых в собственном коде.

EXTERNAL NAME <method_specifier>
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

Указывает метод сборки для привязки к триггеру. Этот метод не должен принимать аргументы и возвращать значения 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 Azure не поддерживаются триггеры событий входа в систему.

Разрешения

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

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

Примеры

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

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  

См. также

DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL)
sp_helptrigger (Transact-SQL)
Создание хранимой процедуры
sp_addmessage (Transact-SQL)
Транзакции
Получение сведений о триггерах DML
Получение сведений о триггерах DDL
sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL)
sys.sql_modules (Transact-SQL)
sys.assembly_modules (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)
Внесение изменений в схемы баз данных публикации