DML 트리거 구현

DML 트리거를 만들기 전에 다음을 고려해야 합니다.

  • CREATE TRIGGER 문은 일괄 처리에서 첫 번째 문이어야 합니다. 일괄 처리에서 다른 모든 문은 CREATE TRIGGER 문 정의의 일부로 해석됩니다.

  • DML 트리거를 만들 수 있는 기본 권한은 테이블 소유자에게 있습니다. 테이블 소유자는 이 권한을 다른 사용자에게 부여할 수 없습니다.

  • DML 트리거는 데이터베이스 개체이며 트리거 이름은 식별자 규칙을 따라야 합니다.

  • DML 트리거가 현재 데이터베이스 외부의 개체를 참조할 수 있지만 현재 데이터베이스에서만 DML 트리거를 만들 수 있습니다.

  • DML 트리거가 임시 테이블을 참조할 수 있지만 임시 테이블 또는 시스템 테이블에서 DML 트리거를 만들 수는 없습니다. DML 트리거는 시스템 테이블을 참조할 수 없습니다. 대신 정보 스키마 뷰를 사용해야 합니다.

  • DELETE 또는 UPDATE 동작으로 정의된 외래 키가 있는 테이블에는 INSTEAD OF DELETE 및 INSTEAD OF UPDATE 트리거를 정의할 수 없습니다.

  • TRUNCATE TABLE 문이 WHERE 절 없이 모든 행을 삭제하는 DELETE 문과 유사하긴 하지만 TRUNCATE TABLE 문은 로그되지 않기 때문에 DELETE 트리거를 시작할 수 없습니다.

  • WRITETEXT 문은 INSERT 또는 UPDATE 트리거를 시작할 수 없습니다.

중요 정보중요

이후 버전의 SQL Server에서는 트리거에서 결과 집합을 반환하는 기능이 제거됩니다. 결과 집합을 반환하는 트리거는 트리거가 작동하지 않는 응용 프로그램에 예기치 않은 동작을 유발할 수도 있습니다. 새 개발 작업에서는 트리거에서 결과 집합을 반환하지 않도록 하고 현재 이와 같이 작동하는 응용 프로그램은 수정하십시오. SQL Server에서 트리거가 결과 집합을 반환하지 않도록 하려면 disallow results from triggers 옵션을 1로 설정합니다. 이후 버전의 SQL Server에서는 이 옵션이 기본적으로 1로 설정됩니다.

DML 트리거를 만들 때는 다음을 지정합니다.

  • 이름

  • 트리거를 정의할 테이블

  • 트리거를 시작할 시기

  • 트리거를 실행하는 데이터 수정 문을 지정합니다. 유효한 옵션은 INSERT, UPDATE 또는 DELETE입니다. 둘 이상의 데이터 수정 문이 동일한 트리거를 실행할 수 있습니다. 예를 들어 INSERT 및 UPDATE 문이 트리거를 활성화할 수 있습니다.

  • 트리거 동작을 수행하는 프로그래밍 문

다중 DML 트리거

테이블에는 지정된 유형의 AFTER 트리거를 서로 다른 이름으로 여러 개 포함할 수 있습니다. 각 트리거에서 여러 기능을 수행할 수 있습니다. 그러나 세 개의 사용자 동작(UPDATE, INSERT 및 DELETE)의 모든 하위 집합에 하나의 트리거를 적용할 수 있지만 각 트리거는 한 테이블에만 적용할 수 있습니다.

테이블에는 INSTEAD OF 트리거를 지정된 유형으로 하나만 포함할 수 있습니다.

트리거 사용 권한 및 소유권

트리거는 트리거가 정의된 테이블 또는 뷰의 스키마에 생성됩니다. 예를 들어 트리거 Trigger1HumanResources.Employee 테이블에 생성되면 트리거의 스키마 한정 이름은 HumanResources.Trigger1이 됩니다.

CREATE TRIGGER 사용 권한은 트리거가 정의된 테이블 소유자, sysadmin 고정 서버 역할 및 db_ownerdb_ddladmin 고정 데이터베이스 역할 멤버의 기본 권한이며 다른 대상에게 이 권한을 부여할 수 없습니다.

INSTEAD OF 트리거를 뷰에 만들 경우 뷰 소유자가 뷰와 트리거에서 참조하는 기본 테이블을 소유하지 않으면 소유권 체인이 끊어집니다. 뷰 소유자가 기본 테이블을 소유하지 않는 경우에는 테이블 소유자가 뷰를 읽거나 업데이트하는 사용자에게 필요한 사용 권한을 별도로 부여해야 합니다. 동일한 사용자가 뷰 및 원본으로 사용하는 기본 테이블을 모두 소유하면 개별 기본 테이블이 아닌 뷰에 대한 사용 권한만 다른 사용자에게 부여해야 합니다. 자세한 내용은 소유권 체인을 참조하십시오.

트리거를 만들려면