DML 트리거
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
DML 트리거는 트리거에 정의된 테이블 또는 뷰에 영향을 주는 DML(데이터 조작 언어) 이벤트가 발생할 때 자동으로 적용되는 특수 유형의 저장 프로시저입니다. DML 이벤트에는 INSERT, UPDATE 또는 DELETE 문이 포함됩니다. DML 트리거는 비즈니스 규칙 및 데이터 무결성을 적용하고, 다른 테이블을 쿼리하고, 복잡한 Transact-SQL 문을 포함하는 데 사용할 수 있습니다. 트리거와 트리거를 실행하는 문은 하나의 트랜잭션으로 취급되며, 트리거 내에서 롤백할 수 있습니다. 디스크 공간 부족 등의 심각한 오류가 발견되면 전체 트랜잭션이 자동으로 롤백됩니다.
DML 트리거의 이점
DML 트리거는 엔터티 무결성 또는 도메인 무결성을 적용할 수 있다는 점에서 제약 조건과 비슷합니다. 일반적으로 엔터티 무결성은 항상 가장 낮은 수준에서 PRIMARY KEY 및 UNIQUE 제약 조건의 일부이거나 제약 조건과 독립적으로 생성되는 인덱스에 의해 적용되어야 합니다. 도메인 무결성은 CHECK 제약 조건을 통해 적용되어야 하며, 참조 무결성(RI)은 FOREIGN KEY 제약 조건을 통해 적용되어야 합니다. DML 트리거는 제약 조건에서 지원하는 기능이 애플리케이션의 기능적 요구 사항을 충족할 수 없을 때 가장 유용합니다.
다음 목록에서는 DML 트리거를 제약 조건과 비교하고 제약 조건에 대한 DML 트리거의 이점을 식별합니다.
DML 트리거는 데이터베이스의 관련 테이블을 통해 변경 내용을 캐스케이드할 수 있지만, 이러한 변경 내용은 캐스케이드 참조 무결성 제약 조건을 사용하여 더 효율적으로 실행할 수 있습니다. FOREIGN KEY 제약 조건은 REFERENCES 절에서 계단식 참조 작업을 정의하지 않는 한 다른 열의 값과 정확히 일치하는 경우에만 열 값의 유효성을 검사할 수 있습니다.
이러한 제약 조건은 악의적이거나 잘못된 INSERT, UPDATE, DELETE 작업을 방지하고 CHECK 제약 조건으로 정의된 것보다 더 복잡한 다른 제한을 적용할 수 있습니다.
CHECK 제약 조건과 달리 DML 트리거는 다른 테이블의 열을 참조할 수 있습니다. 예를 들어, 트리거는 다른 테이블의 SELECT를 사용하여 삽입되거나 업데이트된 데이터와 비교하고 데이터를 수정하거나 사용자 정의 오류 메시지를 표시하는 등의 추가적인 작업을 수행할 수 있습니다.
데이터 수정 전후의 테이블 상태를 평가하고 그 차이에 따라 조치를 취할 수 있습니다.
테이블에 같은 유형(INSERT, UPDATE 또는 DELETE)의 DML 트리거를 여러 개 만들면 같은 수정 문이 실행될 때 여러 다른 동작을 실행할 수 있습니다.
제약 조건은 표준화된 시스템 오류 메시지를 통해서만 오류에 대해 통신할 수 있습니다. 애플리케이션에 사용자 지정 메시지와 더 복잡한 오류 처리가 필요하거나 이를 통해 이점을 얻을 수 있는 경우 트리거를 사용해야 합니다.
DML 트리거는 참조 무결성을 위반하는 변경을 허용하지 않거나 롤백하여 데이터 수정 시도를 취소할 수 있습니다. 이러한 트리거는 외래 키를 변경하고 새 값이 기본 키와 일치하지 않을 때 적용될 수 있습니다. 그러나 FOREIGN KEY 제약 조건은 일반적으로 이러한 목적으로 사용됩니다.
트리거 테이블에 제약 조건이 있으면 INSTEAD OF 트리거가 실행된 후 AFTER 트리거가 실행되기 전에 제약 조건이 확인됩니다. 제약 조건을 위반하면 INSTEAD OF 트리거 동작이 롤백되고 AFTER 트리거가 실행되지 않습니다.
DDL 트리거의 유형
AFTER 트리거
AFTER 트리거는 INSERT, UPDATE, MERGE 또는 DELETE 문의 동작이 수행된 후에 실행됩니다. 제약 조건 위반이 발생하면 AFTER 트리거가 실행되지 않으므로 제약 조건 위반을 방지할 수 있는 처리에는 이러한 트리거를 사용할 수 없습니다. MERGE 문에 지정된 모든 INSERT, UPDATE 또는 DELETE 작업에 대해 각 DML 작업에 해당하는 트리거가 실행됩니다.
INSTEAD OF 트리거
INSTEAD OF 트리거는 트리거 문의 표준 작업을 재정의합니다. 따라서 이 트리거를 사용하여 하나 이상의 열에서 오류나 값을 확인하고 행을 삽입, 업데이트 또는 삭제하기 전에 추가 동작을 수행할 수 있습니다. 예를 들어, 급여 테이블의 시간당 임금 열에서 업데이트되는 값이 지정된 값을 초과하면 트리거를 정의하여 오류 메시지를 생성하고 트랜잭션을 롤백하거나 감사 추적에 새 레코드를 삽입한 후 급여 테이블에 레코드를 삽입하도록 트리거를 정의할 수 있습니다. INSTEAD OF 트리거의 주요 장점은 업데이트할 수 없는 뷰도 업데이트를 지원하도록 사용하도록 설정할 수 있다는 것입니다. 예를 들어, 여러 기준 테이블을 기반으로 하는 뷰는 둘 이상의 테이블에 있는 참조 데이터를 삽입, 업데이트 및 삭제하려면 INSTEAD OF 트리거를 사용해야 합니다. INSTEAD OF 트리거의 또 다른 이점은 일괄 처리의 일부는 계속 처리하고 다른 일부는 처리하지 않도록 하는 논리를 코드화할 수 있게 한다는 것입니다.
이 테이블에서는 AFTER 트리거와 INSTEAD OF 트리거의 기능을 비교합니다.
함수 | AFTER 트리거 | INSTEAD OF 트리거 |
---|---|---|
적용 가능성 | 테이블 | 테이블 및 뷰 |
각 테이블이나 뷰에서 가능한 트리거 수 | 트리거 작업당 여러 개(UPDATE, DELETE 및 INSERT) | 트리거 작업당 하나(UPDATE, DELETE 및 INSERT) |
하향 전달 참조 | 적용되는 제한 없음 | 연계 참조 무결성 제약 조건이 적용되는 테이블에는 INSTEAD OF UPDATE 트리거와 DELETE 트리거가 허용되지 않습니다. |
실행 | 이후: 제약 조건 처리 선언적 참조 동작 삽입된 테이블 및 삭제된 테이블 생성 트리거 작업 |
이전: 제약 조건 처리 다음으로 바꾸기: 트리거 작업 이후: 삽입된 테이블 및 삭제된 테이블 생성 |
실행 순서 | 첫 실행과 마지막 실행을 지정할 수 있음 | 해당 없음 |
삽입된 테이블 및 삭제된 테이블의 varchar(max), nvarchar(max) 및 varbinary(max) 열 참조 | 허용됨 | 허용됨 |
삽입된 테이블 및 삭제된 테이블의 text, ntext 및 image 열 참조 | 허용되지않음 | 허용됨 |
CLR 트리거
CLR 트리거는 AFTER 또는 INSTEAD OF 트리거일 수 있습니다. 또한 CLR 트리거는 DDL 트리거일 수 있습니다. CLR 트리거는 Transact-SQL 저장 프로시저를 실행하는 대신 관리 코드에 작성된 하나 이상의 메서드를 실행하며, 이는 .NET Framework에서 생성되어 SQL Server에 업로드된 어셈블리의 멤버입니다.
관련 작업
Task | 항목 |
---|---|
DML 트리거를 만드는 방법을 설명합니다. | DML 트리거 만들기 |
CLR 트리거를 만드는 방법을 설명합니다. | CLR 트리거 만들기 |
단일 행 데이터 수정과 다중 행 데이터 수정을 모두 처리하는 DML 트리거를 만드는 방법에 대해 설명합니다. | DML 트리거를 생성하여 여러 행의 데이터 처리 |
트리거를 중첩하는 방법을 설명합니다. | 중첩 트리거 만들기 |
AFTER 트리거가 실행되는 순서를 지정하는 방법을 설명합니다. | 첫 번째 및 마지막 트리거 지정 |
트리거 코드에서 특수 삽입 및 삭제 테이블을 사용하는 방법을 설명합니다. | inserted 및 deleted 테이블 사용 |
DML 트리거를 수정하거나 이름을 변경하는 방법을 설명합니다. | DML 트리거 수정 또는 이름 바꾸기 |
DML 트리거에 대한 정보를 보는 방법을 설명합니다. | DML 트리거에 대한 정보 가져오기 |
DML 트리거 삭제하거나 사용하지 않도록 설정하는 방법에 대해 설명합니다. | DML 트리거 삭제 또는 사용 안 함 |
트리거 보안을 관리하는 방법에 대해 설명합니다. | 트리거 보안 관리 |
참고 항목
CREATE TRIGGER(Transact-SQL)
ALTER TRIGGER(Transact-SQL)
DROP TRIGGER(Transact-SQL)
DISABLE TRIGGER(Transact-SQL)
트리거 함수(Transact-SQL)