เพื่อแก้ปัญหาของคุณเราต้องใช้วิธีการเขียนโปรแกรมเพื่อแก้ไขปัญหา มีสองเส้นทางที่คุณสามารถไปที่นี่ได้ เหตุผลที่ต้องใช้วิธีการเหล่านี้เนื่องจากคุณไม่สามารถปิดการใช้งานทริกเกอร์สำหรับคำสั่งเฉพาะมันสามารถถูกปิดการใช้งานสำหรับตารางทั้งหมดเท่านั้น
ตัวเลือก 1: Context_Info ()
Samuel Vanga บน MS SQL Tipsเป็นตัวอย่างที่ดี:
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
ตอนนี้เมื่อซามูเอลไม่ต้องการให้ตัวกระตุ้นดำเนินการพวกเขาใช้สิ่งนี้:
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 เบนกานมีทางออกที่ดีในหนังสือของเขา "ภายใน Microsoft SQL Server 2008 การเขียนโปรแกรม T-SQL: T-SQL Programming" ซึ่งยังอยู่ในหนังสือของเขาในภายหลัง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