테이블을 삭제하려고 하였으나 설정된 Trigger(트리거)에 의해서 테이블 삭제가 실패하였습니다. 어떤 트리거가 설정되어 있는지 확인하고 트리거 동작을 중지하는 방법에 대해서 아래와 같이 정리하였습니다.


[환경]
SQL Server 2008 SP1


[현상]
특정 테이블을 삭제하려고 DROP TABLE 명령을 수행하였으나 아래와 같은 오류가 발생합니다.

Msg 3609, Level 16, State 2, Line 1
트리거가 발생하여 트랜잭션이 종료되었습니다. 일괄 처리가 중단되었습니다.



[원인]
해당 유저 데이터베이스에 DDL(Data Definition Language) 트리거가 설정되어 있습니다. DROP 명령이 수행될 때 트리거가 동작하여 DROP 트랜잭션을 Rollback 하도록 설정되어 있습니다.


[해결방법]
사용하지 않는 불필요한 트리거라면 아래 쿼리로 삭제합니다.

DROP TRIGGER [TRI_DROP] ON DATABASE


또는 트리거를 삭제하지 않고 비활성화 할 수도 있습니다. 

DISABLE TRIGGER TRI_DROP ON DATABASE



[분석결과]
1. 설정된 트리거 확인
 가. T-SQL

USE LAIGO
GO

-- 설정된 트리거 확인
SELECT name, type, type_desc, is_disabled FROM SYS.TRIGGERS
GO



-- DROP_TABLE 트리거 존재 확인
SELECT * FROM SYS.TRIGGER_EVENTS
GO



 나. SSMS 를 사용하여 확인할 수도 있습니다.
   - Databases - LAIGO - Programmablility - Database Triggers - TRI_DROP


[참고자료]
DISABLE TRIGGER(Transact-SQL)
http://msdn.microsoft.com/ko-kr/library/ms189748.aspx


작성자 : Lai Go / 작성일자 : 2009.10.12

저작자 표시 비영리 변경 금지
Posted by Lai Go