2010-11-16 28 views
15

मैं एक लेनदेन के अंदर एक लॉग फ़ाइल में लिखने की कोशिश कर रहा हूं ताकि लॉगौती वापस आने पर भी लॉग रहे।लेनदेन के अंदर टीएसक्यूएल लॉगिंग

--start कोड

शुरू ट्रॅन

डालने [कुछ] dbo.logtable

में [[मुख्य कोड यहाँ]]

रोलबैक

प्रतिबद्ध

- अंतिम कोड

आप लेनदेन शुरू होने से पहले लॉग कह सकते हैं लेकिन यह इतना आसान नहीं है क्योंकि इस एस-प्रो चलाने से पहले लेनदेन शुरू होता है (यानी। कोड एक बड़े लेनदेन का हिस्सा है)

तो, संक्षेप में, एक लेनदेन के अंदर एक विशेष बयान लिखने का कोई तरीका है जो लेनदेन का हिस्सा नहीं है। मुझे आशा है कि मेरा प्रश्न समझ में आता है।

+0

कृपया http://stackoverflow.com/questions/3725356/suppress-transaction-in-stored-procedure –

उत्तर

12

लॉग जानकारी रखने के लिए एक तालिका चर (@temp) का उपयोग करें। तालिका चर एक लेनदेन रोलबैक जीवित रहते हैं।

this article देखें।

+0

पर एक नज़र डालें, जो मैं सुझाव देने जा रहा था। मैंने इसे सफलतापूर्वक कई बार इस्तेमाल किया है। – HLGEM

+0

इसके साथ समस्या यह है कि यदि कोई कनेक्शन कनेक्शन टाइमआउट या निष्पादन टाइमआउट की तरह होता है, तो आपको कोई लॉग नहीं छोड़ा जा रहा है। – Talon

2

उस समय मेरी ज़रूरतों के आधार पर, मैं इसे दो तरीकों से करता हूं। दोनों में एक चर का उपयोग करना शामिल है, जो रोलबैक के बाद अपना मूल्य बरकरार रखता है।

1) DECLARE @Log varchar(max) मान बनाएं और इसका उपयोग करें: @SET @ लॉग = ISNULL (@ लॉग + ';', '') + 'आपकी नई लॉग जानकारी यहां' . Keep appending to this as you go through the transaction. I'll insert this into the log after the commit or the rollback as necessary. I'll usually only insert the @Log value into the real log table when there is an error (in the कैच ब्लॉक) या यदि मैं कोशिश कर रहा हूं एक समस्या डीबग करें।

2) DECLARE @LogTable table (RowID int identity(1,1) primary key, RowValue varchar(5000) बनाएं। जब आप अपने लेनदेन के माध्यम से प्रगति करते हैं तो मैं इसमें डालता हूं। मुझे इस तालिका में लेनदेन में उपयोग की जाने वाली पंक्तियों के वास्तविक आईडी (और संदेशों के साथ अन्य कॉलम, जैसे 'आइटम हटाएं 1234') डालने के लिए OUTPUT खंड का उपयोग करना पसंद है। मैं इस तालिका को प्रतिबद्ध या रोलबैक के बाद आवश्यक लॉग तालिका में डाल दूंगा।

+0

उनमें से दोनों अच्छे हैं, सिवाय इसके कि मेरे पास लेनदेन भाग तक आसान पहुंच नहीं है। असल में मैं सी # में लिखे गए एक प्रोग्राम को डीबग करने की कोशिश कर रहा हूं। – Arvid

+1

(चलो इसे खत्म करें :-) सी # कोड एक लेनदेन शुरू करता है, फिर एक एस-प्रो कॉल करता है, और अंत में यह लेनदेन को वापस या रोल करता है। मेरे पास केवल एस-प्रो के लिए आसान पहुंच है और मैं उम्मीद कर रहा था कि मैं कुछ डीबगिंग कोड कर सकता हूं जो रोलबैक – Arvid

+0

से बच जाएगा, आप [xp_cmdshell (ट्रांसएक्ट-एसक्यूएल)] (http://msdn.microsoft.com] का उपयोग करने का प्रयास कर सकते हैं। /en-us/library/ms175046.aspx) (लेकिन इसे सुरक्षा जोखिम के रूप में बंद कर दिया जा सकता है) इन्हें अपनी प्रक्रिया में शामिल करने के लिए: 'EXEC xp_cmdshell echo' यहां अपना संदेश '>> log.txt' फ़ाइल को लिखने के लिए । आप आउटपुट पैरामीटर @ErrorInfo varchar (max) 'का उपयोग करने का भी प्रयास कर सकते हैं, जहां आप सी # प्रोग्राम में त्रुटि जानकारी वापस भेजते हैं ताकि यह लॉग कर सके। –

1

यदि अभिभावक लेनदेन वापस रोल करता है तो लॉगिंग डेटा भी वापस रोल करेगा - SQL सर्वर उचित नेस्टेड लेनदेन का समर्थन नहीं करता है। लॉगिंग करने के लिए सीएलआर संग्रहीत प्रक्रिया का उपयोग करना एक संभावना है। यह लेनदेन के बाहर डेटाबेस से अपना कनेक्शन खोल सकता है और लॉग डेटा दर्ज और प्रतिबद्ध कर सकता है।

+0

सीएलआर लॉगिंग प्रक्रिया का उपयोग करना सबसे अच्छा समाधान है। अगर किसी भी तरह से संभवतः पैरामीटर के वास्तविक मान प्राप्त करने के लिए संभव था तो स्पोक को बुलाया गया था..हम हमेशा सपने देख सकते हैं। –

7

एक वैकल्पिक समाधान sp_trace_generateevent पर आधारित है कि एक गुंजाइश @table चर (जो हमेशा संभव नहीं है) या जब लेनदेन सीमाओं नियंत्रण के बाहर हैं की आवश्यकता नहीं है के लिए Logging messages during a transaction देखें।

+0

ऐसा लगता है कि यह काम करेगा। त्वरित उत्तरों के लिए सभी को धन्यवाद। – Arvid

0

आप नेस्टेड लेनदेन व्यवहार का अनुकरण करने में नामित किया है लेनदेन का उपयोग कर सकते हैं:

begin transaction a 

create table #a (i int) 

select * from #a 
save transaction b 

create table #b (i int) 
select * from #a 
select * from #b 

rollback transaction b 

select * from #a 
rollback transaction a 

एसक्यूएल सर्वर में यदि आप एक 'उप-लेन-देन' चाहते हैं आप save transaction xxxx जो एक दैवज्ञ चौकी की तरह काम करता उपयोग करना चाहिए।

+3

यह उत्तर बिल्कुल प्रश्न का उत्तर नहीं देता है। ओपी उप-लेनदेन के बारे में नहीं पूछ रहा है, इसके विपरीत। वह कुछ ऑपरेशन लेनदेन संदर्भ से बाहर रखा जाना चाहता है और डेटाबेस में सीधे किया गया है। – Tipx

+0

मेरी प्रतिक्रिया इसके ऊपर टिप्पणी के लिए थी - और मुझे लगता है कि यह काफी संक्षेप में उत्तर दिया –

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