एमएस एसक्यूएल सर्वर में, मैं क्लाइंट द्वारा पारित सत्र से संबंधित जानकारी संग्रहीत करने के लिए एक वैश्विक अस्थायी तालिका का उपयोग कर रहा हूं और फिर मैं उस जानकारी को ट्रिगर्स के अंदर उपयोग करता हूं।एमएस एसक्यूएल सर्वर - वैश्विक अस्थायी तालिका का सुरक्षित समवर्ती उपयोग?
चूंकि एक ही वैश्विक अस्थायी तालिका का उपयोग अलग-अलग सत्रों में किया जा सकता है और जब मैं इसमें लिखना चाहता हूं तो यह हो सकता है या नहीं हो सकता है (इस पर निर्भर करता है कि पिछले सभी सत्र जो इसे पहले बंद कर चुके हैं), मैं कर रहा हूं ग्लोबल अस्थायी तालिका अस्तित्व के लिए एक चेक जिसके आधार पर मैं इसे लिखने से पहले बना हूं।
IF OBJECT_ID('tempdb..##VTT_CONTEXT_INFO_USER_TASK') IS NULL
CREATE TABLE ##VTT_CONTEXT_INFO_USER_TASK (
session_id smallint,
login_time datetime,
HstryUserName VDT_USERNAME,
HstryTaskName VDT_TASKNAME,
)
MERGE ##VTT_CONTEXT_INFO_USER_TASK As target
USING (SELECT @@SPID, @HstryUserName, @HstryTaskName) as source (session_id, HstryUserName, HstryTaskName)
ON (target.session_id = source.session_id)
WHEN MATCHED THEN
UPDATE SET HstryUserName = source.HstryUserName, HstryTaskName = source.HstryTaskName
WHEN NOT MATCHED THEN
INSERT VALUES (@@SPID, @LoginTime, source.HstryUserName, source.HstryTaskName);
समस्या तालिका अस्तित्व के लिए मेरा चैक और MERGE
बयान के बीच, एसक्यूएल सर्वर अस्थायी तालिका छोड़ सकते कि सभी सत्रों जो इसे पहले हो उपयोग कर रहे थे कि सटीक उदाहरण में बंद करने के लिए कि क्या (यह वास्तव में क्या हुआ है मेरे परीक्षण में)।
इस तरह के समवर्ती मुद्दों से बचने के तरीके पर एक सर्वोत्तम अभ्यास है, कि इसके अस्तित्व के लिए चेक और इसके बाद के उपयोग के बीच एक तालिका नहीं छोड़ी गई है?
त्वरित उत्तर के लिए धन्यवाद! जबकि मैं मानता हूं कि मैंने स्थायी कोड बनाम अस्थायी साझा स्टोरेज अवधारणा नहीं माना है और आपने मुझे कुछ सोचने के लिए कुछ दिया है, मेरे पास वैश्विक अस्थायी तालिका का उपयोग करने के लिए कारण हैं: - मेरे काम में, मैं उपयोग करने के लिए स्वतंत्र हूं अस्थायी सारणी, लेकिन वास्तविक तालिकाओं के निर्माण को एक अलग, औपचारिक, नौकरशाही प्रक्रिया के माध्यम से जाना है; मैं इससे बचने की कोशिश करता हूं। - एक अस्थायी तालिका का उपयोग करके, मुझे लाभ मिलता है कि SQL सर्वर इसे मेरे लिए हटा देता है जब कोई सत्र अब इसका उपयोग नहीं कर रहा है। एक असली मेज बस वहां रहेगी और बढ़ती रहेगी। –
@loadH। । । ओह, हां, नौकरशाही और अजीब मतभेद वास्तव में चीजों को पूरा करने के लिए। मैं पूरी तरह से समझता हूं। फिर भी, शायद कुछ स्टार्ट-अप कार्रवाई के दौरान वैश्विक अस्थायी तालिका बनाने की संभावना है, इसलिए यह ट्रिगर्स के लिए उपलब्ध है। मुझे ट्रिगर्स में टेबल बनाने की कोशिश करने का विचार पसंद नहीं है। –