다음을 통해 공유


DML 트리거

적용 대상:SQL ServerAzure SQL 데이터베이스Azure SQL Managed Instance

DML 트리거는 트리거에 정의된 테이블 또는 뷰에 영향을 주는 DML(데이터 조작 언어) 이벤트가 발생할 때 자동으로 적용되는 특수한 유형의 저장 프로시저입니다. DML 이벤트에는 INSERT, UPDATE, 또는 DELETE 문이 포함됩니다. DML 트리거는 비즈니스 규칙 및 데이터 무결성을 적용하고, 다른 테이블을 쿼리하고, 복잡한 Transact-SQL 문을 포함하는 데 사용할 수 있습니다. 트리거와 트리거를 실행하는 문은 하나의 트랜잭션으로 취급되며, 트리거 내에서 롤백할 수 있습니다. 디스크 공간 부족 등의 심각한 오류가 발견되면 전체 트랜잭션이 자동으로 롤백됩니다.

혜택

DML 트리거는 엔터티 무결성 또는 도메인 무결성을 적용할 수 있다는 점에서 제약 조건과 비슷합니다. 일반적으로 엔터티 무결성은 제약 조건의 PRIMARY KEY 일부이거나 제약 조건과 UNIQUE 독립적으로 생성되는 인덱스에 의해 항상 가장 낮은 수준에서 적용되어야 합니다. 도메인 무결성은 제약 조건을 통해 CHECK 적용되어야 하며 RI(참조 무결성)는 제약 조건을 통해 FOREIGN KEY 적용되어야 합니다. DML 트리거는 제약 조건에서 지원하는 기능이 애플리케이션의 기능 요구 사항을 충족할 수 없는 경우에 가장 유용합니다.

다음 목록에서는 DML 트리거를 제약 조건과 비교하고 제약 조건에 대한 DML 트리거의 이점을 식별합니다.

  • DML 트리거는 데이터베이스의 관련 테이블을 통해 변경 내용을 캐스케이드할 수 있지만, 이러한 변경 내용은 캐스케이드 참조 무결성 제약 조건을 사용하여 더 효율적으로 실행할 수 있습니다. FOREIGN KEY 제약 조건은 REFERENCES 절에서 연쇄 참조 작업을 정의하지 않는 한, 다른 열의 값과 정확히 일치하는 경우에만 열 값의 유효성을 검사할 수 있습니다.

  • 악의적이거나 잘못된 INSERTUPDATE작업을 방지하고 DELETE 제약 조건으로 정의된 CHECK 제한보다 더 복잡한 다른 제한을 적용할 수 있습니다.

    제약 조건과 달리 CHECK DML 트리거는 다른 테이블의 열을 참조할 수 있습니다. 예를 들어 트리거는 다른 테이블의 SELECT 데이터를 사용하여 삽입되거나 업데이트된 데이터와 비교하고 데이터 수정 또는 사용자 정의 오류 메시지 표시와 같은 다른 작업을 수행할 수 있습니다.

  • 데이터 수정 전후의 테이블 상태를 평가하고 그 차이에 따라 조치를 취할 수 있습니다.

  • 테이블에서 동일한 형식(INSERTUPDATE또는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 트리거
적용 가능성 테이블 테이블 및 뷰
각 테이블이나 뷰에서 가능한 트리거 수 트리거 작업당 여러 작업(UPDATEDELETEINSERT) 트리거 작업당 1개(UPDATEDELETEINSERT)
하향 전달 참조 적용되는 제한 없음 INSTEAD OF UPDATEDELETE 트리거는 연계 참조 무결성 제약 조건의 대상인 테이블에서 허용되지 않습니다.
실행 이후:

제약 조건 처리

선언적 참조 동작

inserteddeleted 테이블 만들기

트리거 작업
이전: 제약 조건 처리

다음으로 바꾸기: 트리거 작업

이후: inserteddeleted 테이블 만들기
실행 순서 첫 번째 및 마지막 실행을 지정할 수 있습니다. 해당 없음
varchar(max), nvarchar(max)varbinary(max) 열 참조는 inserteddeleted 테이블에서 사용됩니다. 허용됨 허용됨
텍스트, ntext이미지 열 참조는 inserteddeleted 테이블에 있습니다. 허용되지않음 허용됨

CLR 트리거

CLR(공용 언어 런타임) 트리거는 AFTER 트리거 또는 INSTEAD OF 트리거일 수 있습니다. CLR 트리거는 DDL(데이터 정의 언어) 트리거일 수도 있습니다. CLR 트리거는 Transact-SQL 저장 프로시저를 실행하는 대신 관리 코드에 작성된 하나 이상의 메서드를 실행하며, 이는 .NET Framework에서 생성되어 SQL Server에 업로드된 어셈블리의 멤버입니다.

Task 조항
DML 트리거를 만드는 방법을 설명합니다. DML 트리거 만들기
CLR 트리거를 만드는 방법을 설명합니다. CLR 트리거 만들기
단일 행 데이터 수정과 다중 행 데이터 수정을 모두 처리하는 DML 트리거를 만드는 방법에 대해 설명합니다. DML 트리거를 생성하여 여러 행의 데이터 처리
트리거를 중첩하는 방법을 설명합니다. 중첩 트리거 만들기
트리거가 발생되는 순서를 지정하는 AFTER 방법을 설명합니다. 첫 번째 및 마지막 트리거 지정
트리거 코드에서 특수 삽입 및 삭제 테이블을 사용하는 방법을 설명합니다. 삽입 및 삭제된 테이블 사용
DML 트리거를 수정하거나 이름을 변경하는 방법을 설명합니다. DML 트리거 수정 또는 이름 바꾸기
DML 트리거에 대한 정보를 보는 방법을 설명합니다. DML 트리거에 대한 정보 가져오기
DML 트리거 삭제하거나 사용하지 않도록 설정하는 방법에 대해 설명합니다. DML 트리거 삭제 또는 사용 안 함
트리거 보안을 관리하는 방법에 대해 설명합니다. 트리거 보안 관리