2010-04-15 13 views
11

मैं एक trigger जो इतनी तरह प्रवेश के प्रयोजनों के लिए कुछ डेटा के साथ संबंधित है:एक ट्रिगर में एक चर दर्रा

CREATE TRIGGER trgDataUpdated 
    ON tblData FOR UPDATE 
AS 
BEGIN 
    INSERT INTO tblLog (ParentID, OldValue, NewValue, UserID) 
    SELECT deleted.ParentID, deleted.Value, inserted.Value, 
      @intUserID -- how can I pass this in? 
    FROM inserted INNER JOIN deleted ON inserted.ID = deleted.ID 
END 

मैं कैसे चर @intUserID में ऊपर ट्रिगर में, निम्न कोड में के रूप में पारित कर सकते हैं:

DECLARE @intUserID int 
SET @intUserID = 10 

UPDATE tblData 
SET Value = @x 

पुनश्च: मैं जानता हूँ कि मैं सचमुच ट्रिगर करने के लिए @intUserID में पारित नहीं हो सकता, यह सिर्फ समझाने के उद्देश्य से इस्तेमाल किया गया था।

उत्तर

10

मैं इस तरह की कार्रवाई के लिए SET CONTEXT_INFO का उपयोग करता हूं। यह 2008+ लिंक है, prior link सेवानिवृत्त हो गया है।

SQL सर्वर 2005+ पर, आपके पास पढ़ने के लिए CONTEXT_INFO होगा लेकिन अन्यथा आपको dbo.sysprocesses में context_info कॉलम से प्राप्त करना होगा।

+0

मैं इस पर विचार कर रहा था लेकिन यह सबसे सुरुचिपूर्ण समाधान की तरह नहीं दिख रहा था। अगर यह एकमात्र तरीका है, तो सुनिश्चित करें कि मैं इसे करूँगा, लेकिन मैं कुछ और उम्मीद कर रहा था :( – Codesleuth

+0

@ कोडसथुथ: आप यहां सीमित हैं ... – gbn

+1

मैं इसे अभी कार्यान्वित कर रहा हूं। बस इस लिंक को किसी के लिए पेस्ट करना चाहता था और भविष्य में ऐसा करना चाहते हैं: http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx – Codesleuth

0

आप ट्रिगर को चर नहीं पारित करते हैं क्योंकि आप सीधे ट्रिगर्स को कॉल करने में सक्षम नहीं हैं। उन्हें डालने, संशोधित या हटाए जाने वाले डेटा के परिणामस्वरूप निष्पादित किया जाता है।

+1

मैं एक हाँ के लिए/कोई जवाब यहाँ नहीं देख रहा था। निश्चित रूप से वर्तमान लेनदेन के खिलाफ जानकारी स्टोर करने का एक तरीका है कि ट्रिगर उठा सकता है? – Codesleuth

3

आप एक चर को एक ट्रिगर में पास नहीं कर सकते हैं।

ट्रिगर में जानकारी प्राप्त करने का एकमात्र तरीका यह है कि इसे अंतर्निहित या हटाए गए तालिकाओं के आधार पर चुनें या प्रभावित तालिका पर एक कॉलम जोड़ें और उस कॉलम में मान डालें।

:

पिछले प्रश्न ओपी इस बारे में पोस्ट में संपादित, उन्होंने कहा कि वे नहीं CONTEXT_INFO उपयोग करने के लिए करना चाहता था, लेकिन यहाँ वे कहते हैं कि यह उपयोग करने के लिए ठीक है, इसलिए यहाँ एक CONTEXT_INFO के उपयोग का उदाहरण है प्रक्रिया में ट्रिगर के भाग अद्यतन

DECLARE @intUserID  int 
     ,@CONTEXT_INFO varbinary(128) 
SET @intUserID = 10 
SET @CONTEXT_INFO =cast('intUserID='+CONVERT(varchar(10),@intUserID)+REPLICATE(' ',128) as varbinary(128)) 
SET CONTEXT_INFO @CONTEXT_INFO 

--do update that will fire the trigger 

SET CONTEXT_INFO 0x0 
यहाँ

कर रहा है मान प्राप्त करने के लिए:

DECLARE @intUserID  int 
     ,@sCONTEXT_INFO varchar(128) 
SELECT @sCONTEXT_INFO=CAST(CONTEXT_INFO() AS VARCHAR) FROM master.dbo.SYSPROCESSES WHERE [email protected]@SPID 

IF LEFT(@sCONTEXT_INFO,9)='intUserID' 
BEGIN 
    SET @intUserID=RIGHT(RTRIM(@sCONTEXT_INFO),LEN(RTRIM(@sCONTEXT_INFO))-10) 
END 
ELSE 
BEGIN 
    RAISERROR('intUserID was not specified',16,1) 
    ROLLBACK TRAN 
    RETURN 
END 

..use the @intUserID 
1

आप ट्रिगर्स को वेरिएबल पास नहीं कर सकते हैं। उपयोगकर्ता द्वारा डेटाबेस से कनेक्ट करने के तरीके के आधार पर उपयोगकर्ता डेटाबेस से कनेक्ट होने के लिए SYSTEM_USER का उपयोग कर सकते हैं।

0

यह क्यों इस्तेमाल नहीं:

CREATE TRIGGER trgDataUpdated 
    ON tblData FOR UPDATE 
AS 
BEGIN 
    EXECUTE tbLogUpdate intUserId 
END 
संबंधित मुद्दे