ALTER TRIGGER(Transact-SQL)
CREATE TRIGGER 문을 사용해 만든 DML, DDL 또는 LOGON 트리거의 정의를 수정합니다. 트리거는 CREATE TRIGGER를 사용하여 만듭니다. 이런 트리거는 Transact-SQL 문으로 직접 만들거나 Microsoft.NET Framework CLR(공용 언어 런타임)에서 만들어 SQL Server 인스턴스로 업로드하는 어셈블리의 메서드로 만들 수 있습니다. ALTER TRIGGER 문에 사용되는 매개 변수에 대한 자세한 내용은 CREATE TRIGGER(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
ALTER TRIGGER에 대한 자세한 내용은 CREATE TRIGGER(Transact-SQL)의 주의를 참조하십시오.
DML 트리거
ALTER TRIGGER는 테이블과 뷰의 INSTEAD OF 트리거를 통해 수동으로 업데이트할 수 있는 뷰를 지원합니다. SQL Server는 모든 종류의 트리거(ALTER TRIGGER)에 대해 같은 방법으로 ALTER TRIGGER를 적용합니다.
sp_settriggerorder를 사용하여 테이블에서 실행할 처음 및 마지막 AFTER 트리거를 지정할 수 있습니다. 하나의 테이블에는 처음 및 마지막 AFTER 트리거를 하나씩만 지정할 수 있습니다. 동일한 테이블에 다른 AFTER 트리거가 있는 경우 무작위로 실행됩니다.
ALTER TRIGGER 문에서 첫 번째 트리거나 마지막 트리거를 변경하면 수정된 트리거에 설정된 첫 번째 또는 마지막 특성은 삭제되며 sp_settriggerorder를 사용하여 순서 값을 다시 설정해야 합니다.
AFTER 트리거는 트리거를 시작하는 SQL 문이 성공적으로 실행된 후에만 실행됩니다. 또한 업데이트 또는 삭제된 개체와 관련된 모든 참조 연계 동작과 제약 조건 확인 작업이 성공적으로 수행되어야 합니다. AFTER 트리거 작업은 트리거를 시작하는 문의 효과와 문에 의해 발생하는 모든 참조 연계 UPDATE 및 DELETE 동작의 효과를 확인합니다.
부모 테이블의 DELETE 시 CASCADE 결과가 자식 테이블이나 참조하는 테이블에 대한 DELETE 동작이며 자식 테이블에 DELETE 시 INSTEAD OF 트리거가 정의되어 있으면 트리거가 무시되고 DELETE 작업이 실행됩니다.
DDL 트리거
DDL 트리거는 DML 트리거와 달리 스키마로 범위가 한정되지 않습니다. 따라서 DDL 트리거에 대한 메타데이터를 쿼리할 때는 OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY 및 OBJECTPROPERTY(EX)를 사용할 수 없습니다. 대신 카탈로그 뷰를 사용하십시오. 자세한 내용은 DDL 트리거에 대한 정보 가져오기를 참조하십시오.
다음 예에서는 사용자가 SalesPersonQuotaHistory 테이블에 데이터를 추가 또는 변경하려고 시도하면 클라이언트로 사용자 정의 메시지를 인쇄하는 DML 트리거를 만드는 방법을 보여 줍니다. 그런 다음 INSERT 작업에만 해당 트리거를 적용하도록 ALTER TRIGGER를 사용하여 트리거를 수정합니다. 이 트리거는 테이블에 행을 삽입하거나 업데이트하는 사용자에게 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
