आपकी समस्या को हल करने के लिए, हमें समस्या के लिए एक प्रोग्रामेटिक तरीका अपनाना होगा। यहां जाने के लिए दो मार्ग हैं। इन दृष्टिकोणों की आवश्यकता का कारण यह है कि आप किसी विशेष विवरण के लिए ट्रिगर को अक्षम नहीं कर सकते, यह केवल तालिका की संपूर्णता के लिए अक्षम किया जा सकता है।
विकल्प 1: संदर्भ_इन्फो ()
MS SQL टिप्स पर सैमुअल वंगा का एक बेहतरीन उदाहरण था:
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: अस्थायी तालिका
इत्ज़िक बेन-गण की अपनी पुस्तक "इनसाइड माइक्रोसॉफ्ट SQL सर्वर 2008 टी-एसक्यूएल प्रोग्रामिंग: टी-एसक्यूएल प्रोग्रामिंग" में एक महान समाधान है जो उनकी बाद की पुस्तक टी-एसक्यूएल क्वेरी में भी है । इस 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