2010-11-23 5 views
8

कुछ संग्रहीत प्रक्रियाएं हैं जो नियमित रूप से हमारे डेटाबेस में कुछ तालिकाओं पर रखरखाव करने के लिए कुछ अलग-अलग प्रणालियों द्वारा बुलाती हैं। कुछ स्वचालित हैं, कुछ नहीं हैं।क्या ट्रिगर के लिए डेटा को संशोधित प्रक्रिया के नाम को ढूंढना संभव है?

तालिकाओं में से एक में एक कॉलम है जहां संख्या कभी-कभी बंद होती है, और हम यह सुनिश्चित नहीं करते कि यह कब या क्यों हो रहा है। मैं टेबल पर एक ट्रिगर रखना चाहता हूं ताकि मैं देख सकूं कि क्या बदला जा रहा है और कब, लेकिन यह जानना भी सहायक होगा कि किस प्रक्रिया ने संशोधन शुरू किया था।

क्या ट्रिगर से संग्रहीत प्रक्रिया का नाम प्राप्त करना संभव है? यदि नहीं, तो क्या यह बताने का कोई और तरीका है कि कुछ संशोधित करने के कारण क्या हुआ? (मैं उपयोगकर्ता के बारे में बात नहीं कर रहा हूं, उपयोगकर्ता का नाम इस मामले में मदद नहीं करता है)।

+0

मुझे नहीं लगता कि यह संभव होगा, क्योंकि यह एक संग्रहित प्रक्रिया नहीं हो सकती है, यह एक साधारण बैच हो सकता है। मैं गलत हो सकता हूं, लेकिन मैं कहूंगा कि आपके मामले में आपको किसी विशेष तालिका में शामिल हालिया बैचों की सूची प्राप्त करने के लिए किसी प्रकार की विधि को देखना चाहिए, जो अनिवार्य रूप से मॉनीटर करता है। – BeemerGuy

उत्तर

3

तुम कोशिश कर सकते हैं: CONTEXT_INFO

यहाँ एक CONTEXT_INFO उपयोग उदाहरण है:

हर प्रक्रिया में

डालने कर// अद्यतन कि आप ट्रैक करना चाहते हटाते हैं, तो इस जोड़ें:

DECLARE @string  varchar(128) 
     ,@CONTEXT_INFO varbinary(128) 
SET @string=ISNULL(OBJECT_NAME(@@PROCID),'none') 
SET @CONTEXT_INFO =cast('Procedure='[email protected]+REPLICATE(' ',128) as varbinary(128)) 
SET CONTEXT_INFO @CONTEXT_INFO 

--do insert/delete/update that will fire the trigger 

SET CONTEXT_INFO 0x0 --clears out the CONTEXT_INFO value 

मूल्य को पुनर्प्राप्त करने के लिए ट्रिगर का हिस्सा यहां दिया गया है:

DECLARE @string   varchar(128) 
     ,@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)='Procedure' 
BEGIN 
    SET @string=RIGHT(RTRIM(@sCONTEXT_INFO),LEN(RTRIM(@sCONTEXT_INFO))-10) 
END 
ELSE 
BEGIN --optional failure code 
    RAISERROR('string was not specified',16,1) 
    ROLLBACK TRAN 
    RETURN 
END 

..use the @string 
+0

@ केएम, धन्यवाद, मैं इसे एक शॉट दूंगा, लेकिन मुझे यकीन नहीं है कि मेरी टीम मेरे साथ रोमांचित होगी और अस्थायी डीबगिंग के लिए हर संग्रहीत प्रक्रिया को संशोधित करेगी: पी – Brandon

+0

और भी ठीक नहीं होगा बग? ट्रिगर कभी दर्द हो सकता है। –

+0

APP_NAME() विभिन्न प्रणालियों को ट्रैक करने में मददगार है। – user423430

-4

मैंने यह कोशिश नहीं की है, लेकिन @@ PROCID ऐसा लगता है कि यह वही हो सकता है जो आप चाहते हैं।

+4

मुझे विश्वास है कि एक बार जब आप ट्रिगर कोड के अंदर हों, तो यह ट्रिगर की आईडी वापस कर देगा। –

+1

सही। @@ procid (या object_name (@@ procid)) एक तालिका में कॉलम डिफ़ॉल्ट मान के रूप में उपयोगी है यह जानने के लिए कि कोई प्रविष्टि कहां से आई थी। – bwperrin

1

हमारी प्रणाली पहले से ही किसी अन्य उद्देश्य के लिए CONTEXT_INFO चर का उपयोग कर रही है ताकि यह उपलब्ध न हो। मैंने DBCC INPUTBUFFER solution भी कोशिश की जो लगभग काम करता था। इनपुटबफर पर वापस ड्रॉ यह है कि यह केवल बाहरी कॉलिंग प्रक्रिया देता है। पूर्व: procA proc proc को कॉल करता है जो ट्रिगर को फायर करता है। ट्रिगर डीबीसीसी इन्फुटबफर चलाता है जो केवल procA दिखाता है। चूंकि मेरा ट्रिगर procB की तलाश में था, यह दृष्टिकोण असफल रहा।

इस दौरान मैंने जो किया है वह एक स्टेजिंग टेबल बनाना है। अब procA procb कहते हैं। procB स्टेजिंग टेबल में एक पंक्ति डालता है तो ट्रिगर को फायर करता है। ट्रिगर स्टेजिंग टेबल की जांच करता है और procB प्रविष्टि पाता है। वापसी पर procB स्टेजिंग तालिका से अपनी प्रविष्टि हटा देता है। यह एक खोल खेल है लेकिन यह काम करता है। मुझे इस पर किसी भी प्रतिक्रिया में दिलचस्पी होगी।

संबंधित मुद्दे

 संबंधित मुद्दे