다음을 통해 공유


DML 트리거 실행

제약 조건을 위반하면 AFTER 트리거가 절대로 실행되지 않습니다. 따라서 제약 조건 위반이 발생할 수 있는 처리에 대해서는 이 트리거를 사용할 수 없습니다.

INSTEAD OF 트리거는 트리거 동작 대신 실행됩니다. 이 트리거는 기본 테이블의 변경 내용을 반영하는 inserteddeleted 테이블이 생성된 후 다른 동작이 수행되기 전에 실행됩니다. 이 트리거는 다른 어떤 제약 조건보다 먼저 실행되므로 제약 조건 동작을 보완하는 전처리를 수행할 수 있습니다.

테이블에 정의된 INSTEAD OF 트리거가 테이블에 대해 대개 INSTEAD OF 트리거를 다시 시작하는 문을 실행하면 트리거가 재귀적으로 호출되지 않습니다. 그 대신 테이블에 INSTEAD OF 트리거가 없는 것처럼 문이 처리되어 제약 조건 작업 및 AFTER 트리거 실행 체인을 시작합니다. 예를 들어 DML 트리거가 테이블에 대해 INSTEAD OF INSERT 트리거로 정의되고 트리거가 같은 테이블에서 INSERT 문을 실행하면 INSTEAD OF 트리거에서 실행하는 INSERT 문이 트리거를 다시 호출하지 않습니다. 트리거가 실행하는 INSERT 문은 제약 조건 동작을 수행하고 테이블에 대해 정의된 AFTER INSERT 트리거를 시작하는 프로세스를 시작합니다.

뷰에 정의된 INSTEAD OF 트리거가 뷰에 대해 대개 INSTEAD OF 트리거를 다시 시작하는 문을 실행하면 트리거가 재귀적으로 호출되지 않습니다. 그 대신 문이 뷰를 원본으로 사용하는 기본 테이블에 대해 수정된 것으로 확인됩니다. 이 경우 뷰 정의는 업데이트할 수 있는 뷰에 대한 제한을 모두 만족해야 합니다. 업데이트할 수 있는 뷰에 대한 정의는 뷰를 통해 데이터 수정을 참조하십시오. 예를 들어 DML 트리거가 뷰에 대해 INSTEAD OF UPDATE 트리거로 정의되고 트리거가 같은 뷰를 참조하는 UPDATE 문을 실행하면 INSTEAD OF 트리거가 실행하는 UPDATE 문이 트리거를 다시 호출하지 않습니다. 트리거가 실행하는 UPDATE 문은 뷰에 대해 뷰에 INSTEAD OF 트리거가 없는 것처럼 처리됩니다. UPDATE에 의해 변경된 열은 단일 기본 테이블로 확인되어야 합니다. 원본으로 사용하는 기본 테이블을 수정할 때마다 제약 조건을 적용하고 테이블에 대해 정의된 AFTER 트리거를 시작하는 체인이 시작됩니다.

DML 트리거 성능의 오버헤드는 대개 낮습니다. DML 트리거를 실행하는 시간은 대개 메모리나 데이터베이스 장치에 있을 수 있는 다른 테이블을 참조하는 데 걸립니다. deletedinserted 테이블은 항상 메모리에 있습니다. 트리거가 참조하는 다른 테이블의 위치에 따라 작업에 필요한 시간이 결정됩니다.

[!참고]

DML 트리거에서 커서를 사용하면 성능에 역효과를 줄 수 있으므로 사용하지 않는 것이 좋습니다. 커서 대신 행 집합 기반 논리를 사용하여 여러 행에 영향을 주는 DML 트리거를 디자인할 수 있습니다.

DML 트리거 실행 및 분할 뷰

분할 뷰의 기반이 되는 테이블에서 UPDATE 및 DELETE 트리거가 발생하는 방법이 SQL Server 2000과 달라졌습니다. SQL Server 2000에서 로컬 또는 분산형 분할 뷰에 대해 UPDATE 문이나 DELETE 문을 실행하면 해당 뷰의 기본 테이블에 정의된 모든 UPDATE 또는 DELETE 트리거가 발생합니다. 여기에는 업데이트 또는 삭제 작업에 의해 영향을 받지 않는 테이블의 트리거도 포함됩니다. SQL Server 2008 및 SQL Server 2005에서는 트리거가 정의된 기본 테이블이 업데이트 또는 삭제 작업에 의해 영향을 받는 경우에만 UPDATE 또는 DELETE 트리거가 발생합니다. 이 동작은 AFTER 트리거와 INSTEAD OF 트리거에 대해서도 모두 동일합니다.

예를 들어 T1 테이블과 T2 테이블의 필드로 구성된 분할 뷰 PV가 있다고 가정합니다. 또한 T1T2에 모두 UPDATE 트리거가 정의되어 있습니다. SQL Server 2000에서 T1의 행에만 영향을 주는 UPDATE 문을 PV에 대해 실행하면 T1T2의 UPDATE 트리거가 모두 발생합니다. SQL Server 2008 및 SQL Server 2005에서는 T1에 정의된 UPDATE 트리거만 발생합니다.

다음 표에서는 동작 변경 내용을 요약합니다.

로컬 분할 뷰에 대한 삽입, 업데이트 또는 삭제 작업

 

SQL Server 2000

현재 릴리스

INSERT TRIGGER

영향을 받는 테이블에서만 발생합니다.

영향을 받는 테이블에서만 발생합니다.

UPDATE TRIGGER

분할 뷰의 기반이 되며 이 종류의 트리거가 정의된 모든 테이블에서 발생합니다.

영향을 받는 테이블에서만 발생합니다.

DELETE TRIGGER

분할 뷰의 기반이 되며 이 종류의 트리거가 정의된 모든 테이블에서 발생합니다.

영향을 받는 테이블에서만 발생합니다.

분산형 분할 뷰에 대한 삽입, 업데이트 또는 삭제 작업

 

SQL Server 2000

현재 릴리스

INSERT TRIGGER

분산형 분할 뷰의 테이블 중 영향을 받는 테이블에서만 발생합니다. 로컬 인스턴스 및 원격 인스턴스의 테이블에 정의된 트리거는 해당 테이블이 영향을 받을 경우 발생할 수 있습니다.

분산형 분할 뷰의 테이블 중 영향을 받는 테이블에서만 발생합니다. 로컬 인스턴스 및 원격 인스턴스의 테이블에 정의된 트리거는 해당 테이블이 영향을 받을 경우 발생할 수 있습니다.

UPDATE TRIGGER

분할 뷰의 기반이 되며 이 종류의 트리거가 정의된 모든 테이블에서 발생합니다.

이 종류의 트리거가 정의된 원격 인스턴스의 모든 테이블에서 발생합니다. 로컬 인스턴스에 있는 영향을 받는 테이블에서만 발생합니다.

DELETE TRIGGER

분할 뷰의 기반이 되며 이 종류의 트리거가 정의된 모든 테이블에서 발생합니다.

이 종류의 트리거가 정의된 원격 인스턴스의 모든 테이블에서 발생합니다. 로컬 인스턴스에 있는 영향을 받는 테이블에서만 발생합니다.