문제를 해결하려면 문제에 대한 프로그래밍 방식을 취해야합니다. 여기에 갈 수있는 두 가지 경로가 있습니다. 이러한 접근 방식이 필요한 이유는 특정 명령문에 대한 트리거를 비활성화 할 수 없기 때문에 테이블 전체에 대해서만 비활성화 할 수 있기 때문입니다.
옵션 1 : Context_Info ()
MS SQL 팁의 Samuel Vanga 는 훌륭한 예입니다.
USE AdventureWorks;
GO
-- creating the table in AdventureWorks database
IF OBJECT_ID('dbo.Table1') IS NOT NULL
DROP TABLE dbo.Table1
GO
CREATE TABLE dbo.Table1(ID INT)
GO
-- Creating a trigger
CREATE TRIGGER TR_Test ON dbo.Table1 FOR INSERT,UPDATE,DELETE
AS
DECLARE @Cinfo VARBINARY(128)
SELECT @Cinfo = Context_Info()
IF @Cinfo = 0x55555
RETURN
PRINT 'Trigger Executed'
-- Actual code goes here
-- For simplicity, I did not include any code
GO
이제 Samuel은 트리거가 실행되기를 원하지 않을 때 다음을 사용합니다.
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
다음 시스템보기를 사용하여 현재 세션에 관한 정보를 가져옵니다.
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
여기서 이데올로기는 설정하는 이진 문자열이 현재 세션에만 노출되므로 세션 중에 트리거가 실행될 때 Context_info
함수 의 범위 및 변수 설정 이 표시되고 트리거의 이스케이프 부분으로 이동합니다. 대신에.
옵션 2 : 온도 테이블
Itzik 벤의 GaN 가 훌륭한 솔루션 그의 나중에 책에서 또한 그의 책 "T-SQL 프로그래밍 내부 마이크로 소프트 SQL 서버 2008 T-SQL 프로그래밍"에서 T-SQL 쿼리를 . 이 context_info
기능에 대한 주요 문제점 은 사소한 TempDB 오버 헤드입니다.
놀람을 망치고 책의 음모를 망치지 않기 위해 (나는 그들이 구입할 가치가 있다고 느꼈다), 당신은 방아쇠를 바꿀 것이다.
트리거는 임시 테이블을 확인해야합니다. 임시 테이블이 존재하면 트리거는 종료를 알고 조치를 수행하지 않아야합니다.
수행하려는 업데이트 명령문에서 임시 테이블을 먼저 작성하십시오. 트리거와 동일한 트랜잭션에서 표시되며 트리거로 인해 명령문이 무시됩니다.
트리거 예 :
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
트리거를 실행하지 않으려는 시작 명령문의 예 :
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
당신의 예를 위해 그것을 모두 넣는 것 :
ALTER TRIGGER tiu_benefit ON benefit FOR
...
AS
...
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
--... rest of code here
GO
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
UPDATE benefit SET editor = 'srh' where benefit_id = 9876;
GO