DML 트리거 프로그래밍
일괄 처리로 작성할 수 있는 거의 모든 Transact-SQL 문을 사용하여 DML 트리거를 만들 수 있습니다. 다음 문은 예외입니다.
ALTER DATABASE |
CREATE DATABASE |
DROP DATABASE |
LOAD DATABASE |
LOAD LOG |
RECONFIGURE |
RESTORE DATABASE |
RESTORE LOG |
|
중요: |
---|
LOAD DATABASE 문과 LOAD LOG 문은 이전 버전과의 호환성을 위해 SQL Server 2005에 포함되었으며 이후에는 지원되지 않습니다. |
또한 트리거 작업의 대상인 뷰나 테이블에 대해 다음 Transact-SQL 문을 사용할 경우 DML 트리거의 본문에서 이 문이 허용되지 않습니다.
중요: |
---|
이러한 제한 사항은 SQL Server 2005에 도입되었지만 이전 버전과의 호환성 모드가 80으로 설정되어 있는 경우에도 적용됩니다. |
CREATE INDEX |
ALTER INDEX |
DROP INDEX |
DBCC DBREINDEX |
ALTER PARTITION FUNCTION |
DROP TABLE |
ALTER TABLE(다음과 같은 용도로 사용할 경우)
|
|
|
DML 트리거 정의 난독 처리
CREATE TRIGGER 문의 원래 텍스트를 난독 처리하려면 WITH ENCRYPTION 옵션을 사용하십시오. 난독 처리된 출력은 SQL Server 2005의 시스템 테이블 또는 뷰에서 직접적으로 표시되지 않습니다. 시스템 테이블, 시스템 뷰 또는 데이터베이스 파일에 대한 액세스 권한이 없는 사용자는 난독 처리된 텍스트를 검색할 수 없습니다. 그러나 데이터베이스에 대한 직접 액세스를 포함한 권한이 있는 사용자는 텍스트를 볼 수 있습니다. 이러한 사용자는 난독 처리를 리버스 엔지니어링하여 트리거 정의의 원본 텍스트를 검색할 수 있습니다.
WITH ENCRYPTION을 사용하면 트리거가 SQL Server 복제의 일부로 게시되지 않도록 방지할 수 있습니다.
SET 문 옵션
ODBC 응용 프로그램에서 SQL Server에 연결할 때 다음과 같은 세션 옵션이 자동으로 설정됩니다.
- SET QUOTED_IDENTIFIER ON
- SET TEXTSIZE 2147483647
- SET ANSI_DEFAULTS ON
- SET CURSOR_CLOSE_ON_COMMIT OFF
- SET IMPLICIT_TRANSACTIONS OFF
이렇게 설정하면 ODBC 응용 프로그램의 이식성이 향상됩니다. DB-Library 기반의 응용 프로그램에서는 대개 이러한 옵션을 설정하지 않기 때문에 위의 SET 옵션을 ON과 OFF로 모두 설정하여 트리거를 테스트해야 합니다. 이렇게 테스트하면 특정 연결에서 트리거를 실행할 때 설정된 옵션과 관계없이 트리거가 제대로 실행됩니다. 위의 옵션 중 하나에 대한 설정이 필요한 트리거의 경우 트리거 시작 부분에 SET 문을 사용해야 합니다. 이 SET 문은 트리거가 실행될 때만 적용됩니다. 트리거가 완료되면 원래 설정이 복원됩니다.
특정 열의 변경 여부 테스트
UPDATE() 함수를 사용하여 INSERT 또는 UPDATE 문이 테이블의 특정 열에 영향을 주는지 확인할 수 있습니다. 이 함수는 열에 값이 할당될 때마다 TRUE를 반환합니다.
[!참고] DELETE 문을 사용하여 열의 특정 값을 삭제할 수 없기 때문에 DELETE 문에는 IF UPDATE() 절이 적용되지 않습니다.
또는 COLUMNS_UPDATED 함수를 사용하여 INSERT 또는 UPDATE 문에 의해 업데이트된 테이블 열을 확인할 수 있습니다. 이 함수는 정수 비트 마스크를 사용하여 테스트할 열을 지정합니다. 자세한 내용은 CREATE TRIGGER를 참조하십시오.
예
1. IF UPDATE() 절을 사용하여 데이터 수정 여부 테스트
다음 예에서는 my_table
테이블에 INSERT 트리거인 my_trig
를 만들고 INSERT 문이 b
열에 영향을 주는지 여부를 테스트합니다.
CREATE TABLE my_table*
(a int NULL, b int NULL)
GO
CREATE TRIGGER my_trig
ON my_table
FOR INSERT
AS
IF UPDATE(b)
PRINT 'Column b Modified'
GO
2. COLUMNS UPDATED() 함수를 사용하여 데이터 수정 여부 테스트
다음 예에서는 COLUMNS_UPDATED() 절을 사용하여 유사한 결과를 얻습니다.
CREATE TRIGGER my_trig2
ON my_table
FOR INSERT
AS
IF ( COLUMNS_UPDATED() & 2 = 2 )
PRINT 'Column b Modified'
GO
지연된 이름 확인
DML 트리거는 트리거 생성 시 존재하지 않는 테이블을 참조할 수 있습니다. 이를 지연된 이름 확인이라고 합니다. 지연된 이름 확인에 대한 자세한 내용은 지연된 이름 확인 및 컴파일을 참조하십시오.
[!참고] DML 트리거에서 참조하는 개체가 삭제되거나 이름이 바뀌면 트리거를 실행할 때 오류가 반환됩니다. 그러나 DML 트리거가 참조하는 개체가 같은 이름의 개체로 바뀌면 트리거를 다시 만들지 않고 실행할 수 있습니다. 예를 들어 trig1 트리거가 test1 테이블을 참조할 경우 test1이 삭제되고 test1이라는 다른 테이블이 생성되면 trig1에서 새 테이블을 참조합니다.
결과 반환
DML 트리거에서 아무 결과도 반환하지 않는 것이 좋습니다. 이는 트리거 테이블의 수정이 허용되는 모든 응용 프로그램에서 반환된 결과에 대한 특별한 처리 방식을 만들어야 하기 때문입니다. DML 트리거에서 결과를 반환하지 않게 하려면 트리거 정의에 SELECT 문이나 변수 할당을 포함하지 마십시오. 트리거에서 변수 할당이 반드시 필요한 경우에는 아무 결과 집합도 반환되지 않도록 트리거 앞에 SET NOCOUNT 문을 사용합니다.
중요: |
---|
이후 버전의 SQL Server에서는 트리거에서 결과 집합을 반환하는 기능이 제거됩니다. 새 개발 작업에서는 트리거에서 결과 집합을 반환하지 않도록 하고 현재 이와 같이 작동하는 응용 프로그램은 수정하십시오. SQL Server 2005에서 트리거가 결과 집합을 반환하지 않도록 하려면 disallow results from triggers 옵션을 1로 설정합니다. 이후 버전의 SQL Server에서는 이 옵션이 기본적으로 1로 설정됩니다. |
참고 항목
관련 자료
CREATE TRIGGER(Transact-SQL)
SELECT(Transact-SQL)
SET(Transact-SQL)
도움말 및 정보
변경 내역
릴리스 | 내역 |
---|---|
|