DML 트리거

적용 대상:SQL ServerAzure SQL DatabaseAzure 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 트리거가 실행되지 않습니다.

DML 트리거 유형

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) 열 참조 허용됨 허용됨
삽입 및 삭제 테이블의 텍스트, ntext이미지 열 참조 허용되지 않음 허용됨

CLR 트리거
CLR 트리거는 AFTER 또는 INSTEAD OF 트리거일 수 있습니다. 또한 CLR 트리거는 DDL 트리거일 수 있습니다. TRANSACT-SQL 저장 프로시저를 실행하는 대신 CLR 트리거는 .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)