SQL सर्वर तालिका में परिवर्तन के लिए जाँच करें?


142

मैं किसी भी तरह से डेटाबेस की संरचना को ट्रिगर या संशोधित किए बिना तालिका में परिवर्तन के लिए SQL सर्वर डेटाबेस की निगरानी कैसे कर सकता हूं? मेरा पसंदीदा प्रोग्रामिंग वातावरण .NET और C # है।

मैं किसी भी SQL Server 2000 SP4 या नए का समर्थन करने में सक्षम होना चाहता हूं । मेरा आवेदन किसी अन्य कंपनी के उत्पाद के लिए बोल्ट-ऑन डेटा विज़ुअलाइज़ेशन है। हमारा ग्राहक आधार हजारों में है, इसलिए मैं उन आवश्यकताओं को नहीं रखना चाहता, जिन्हें हम हर इंस्टॉलेशन में तीसरे पक्ष के वेंडर की तालिका में संशोधित करते हैं।

द्वारा "एक टेबल में परिवर्तन" मैं तालिका डेटा को मतलब परिवर्तन, टेबल संरचना में परिवर्तन नहीं।

अंत में, मैं अपने आवेदन में एक घटना को ट्रिगर करने के लिए परिवर्तन चाहूंगा, बजाय एक अंतराल पर परिवर्तनों की जांच करने के।


मेरी आवश्यकताओं को देखते हुए कार्रवाई का सबसे अच्छा कोर्स (कोई ट्रिगर या स्कीमा संशोधन, SQL सर्वर 2000 और 2005) टी-एसक्यूएलBINARY_CHECKSUM में फ़ंक्शन का उपयोग करता प्रतीत होता है । जिस तरह से मैं इसे लागू करने की योजना बना रहा हूं:

प्रत्येक X सेकंड निम्न क्वेरी चलाता है:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);

और संग्रहीत मूल्य के खिलाफ तुलना करें। यदि मान बदल गया है, तो क्वेरी का उपयोग करके पंक्ति द्वारा तालिका पंक्ति के माध्यम से जाएं:

SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);

और संग्रहीत मानों के विरुद्ध दिए गए चेकसम की तुलना करें।


3
वे अपनी पंक्तियों पर अंतिम-संशोधित टाइमस्टैम्प लगाने के लिए नहीं हुए थे, क्या उन्होंने?
zmbq

रिकॉर्ड के लिए, यदि संस्करण समर्थन SQL सर्वर 2005 या नया है। मैं SQL सर्वर की सेवा ब्रोकर सुविधा पर एक नज़र डालूंगा।
मार्को गुइगार्ड

जवाबों:


97

CHECKSUM कमांड पर एक नज़र डालें:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

जब तक तालिका सामग्री नहीं बदली जाती है, तो वह हर बार उसी नंबर को लौटाएगा। अधिक जानकारी के लिए इस पर मेरी पोस्ट देखें:

अंततः,

टेबल बदलने पर कैश निर्भरता के पुनर्निर्माण के लिए मैंने इसका उपयोग कैसे किया:
ASP.NET 1.1 डेटाबेस कैश निर्भरता (ट्रिगर के बिना)


2
चेकसम और अंततः विफल हो सकते हैं। यदि आपका सिस्टम स्वीकार करता है कि डेटा के दो अलग-अलग सेटों का परिणाम समान चेकसम में होगा, तो आप ठीक हैं। इस कारण से, हमें अपनी अधिकांश प्रणालियों में चेकसमों से दूर जाना पड़ा ...
एलपीन्स

@LPains क्या आप अपने बयान पर विस्तार से बता सकते हैं?
पेट्रोसम

1
@petrosmm मुझे यकीन नहीं है कि विशेष रूप से आप मुझे विस्तृत करना चाहते हैं, लेकिन मैं कोशिश करूंगा। कल्पना करें कि आपके पास कुछ सौ अभिलेखों के साथ एक तालिका है, आप अनिवार्य रूप से एक चेकसम के रूप में एक पूर्णांक उत्पन्न करते हैं, कितनी बार टकराना है? मेरे मामले में, मैं ऐसा कर रहा था कि लगभग 10 तालिकाओं के साथ, सैकड़ों रिकॉर्ड के साथ। मेरे पास प्रति दिन कम से कम एक टक्कर थी। इस अन्य उत्तर की जाँच करें stackoverflow.com/questions/14450415/…
LPains

29

दुर्भाग्य से परिवर्तन का पता लगाने के लिए हमेशा सही ढंग से काम नहीं करता है

यह केवल एक आदिम चेकसम और कोई चक्रीय अतिरेक जांच (CRC) गणना है।

इसलिए आप इसका उपयोग सभी परिवर्तनों का पता लगाने के लिए नहीं कर सकते हैं, उदाहरण के लिए सममित परिवर्तनों का परिणाम उसी CHECKSUM में है!

ई। जी। समाधान CHECKSUM_AGG(BINARY_CHECKSUM(*))हमेशा अलग-अलग सामग्री के साथ सभी 3 तालिकाओं के लिए 0 वितरित करेगा:


SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM 
(
  SELECT 1 as numA, 1 as numB
  UNION ALL
  SELECT 1 as numA, 1 as numB
)  q
-- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 1 as numA, 2 as numB UNION ALL SELECT 1 as numA, 2 as numB ) q -- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 0 as numA, 0 as numB UNION ALL SELECT 0 as numA, 0 as numB ) q -- delivers 0!


5
यह वास्तव में एक जवाब नहीं है, यह "आपका सुझाव काम नहीं करता है"।
क्रिश्चियनप

1
BINARY_CHECKSUM से पहले DISINCT कीवर्ड का उपयोग करके डुप्लिकेट किए गए डेटा के लिए इसे रीमेड किया जा सकता है। यहाँ कुछ अन्य कमियों पर चर्चा की गई है लेकिन बिल्कुल सामान्य परिदृश्य नहीं हैं।
जुलाब

25

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


20

डेटाबेस में तालिकाओं के लिए आपको कितनी बार परिवर्तनों की जाँच करने की आवश्यकता है और (पंक्ति आकार के अनुसार) बड़े हैं? यदि आप CHECKSUM_AGG(BINARY_CHECKSUM(*))जॉन द्वारा सुझाई गई विधि का उपयोग करते हैं , तो यह निर्दिष्ट तालिका की प्रत्येक पंक्ति को स्कैन करेगा। NOLOCKसंकेत में मदद करता है, लेकिन एक बड़ी डेटाबेस पर, आप अभी भी हर पंक्ति मार रहे हैं। आपको प्रत्येक पंक्ति के लिए चेकसम स्टोर करने की भी आवश्यकता होगी ताकि आप यह बताएं कि एक बदल गया है।

क्या आपने एक अलग कोण से इस पर जाने पर विचार किया है? यदि आप ट्रिगर्स जोड़ने के लिए स्कीमा को संशोधित नहीं करना चाहते हैं, (जो समझ में आता है, यह आपका डेटाबेस नहीं है), तो क्या आपने एप्लिकेशन विक्रेता के साथ काम करने पर विचार किया है जो डेटाबेस बनाता है?

वे एक एपीआई लागू कर सकते हैं जो एक्सेसरी ऐप को सूचित करने के लिए एक तंत्र प्रदान करता है जो डेटा बदल गया है। यह एक सूचना तालिका में लिखने के रूप में सरल हो सकता है जो यह बताता है कि किस तालिका और किस पंक्ति को संशोधित किया गया था। जिसे ट्रिगर या एप्लिकेशन कोड के माध्यम से लागू किया जा सकता है। आपकी ओर से, टीआई कोई मायने नहीं रखेगा, आपकी एकमात्र चिंता आवधिक आधार पर अधिसूचना तालिका को स्कैन करना होगी। डेटाबेस पर मारा जाने वाला प्रदर्शन परिवर्तनों के लिए हर पंक्ति को स्कैन करने से बहुत कम होगा।

इस सुविधा को लागू करने के लिए कठिन हिस्सा अनुप्रयोग विक्रेता को आश्वस्त करेगा। चूंकि यह ट्रिगर के माध्यम से SQL के माध्यम से पूरी तरह से हैंडल किया जा सकता है, आप ट्रिगर को लिखने और परीक्षण करके और फिर एप्लिकेशन विक्रेता को कोड लाकर उनके लिए बहुत काम कर सकते हैं। विक्रेता ट्रिगर्स का समर्थन करने से, यह उस स्थिति को रोकता है जहां आपका ट्रिगर अनजाने में वेंडर द्वारा आपूर्ति किए गए ट्रिगर को बदल देता है।


18

दुर्भाग्य से, मुझे नहीं लगता कि SQL2000 में ऐसा करने का कोई साफ तरीका है। यदि आप अपनी आवश्यकताओं को SQL सर्वर 2005 (और बाद में) में संकीर्ण करते हैं, तो आप व्यवसाय में हैं। आप SQLDependencyकक्षा का उपयोग कर सकते हैं System.Data.SqlClientSQL सर्वर (ADO.NET) में क्वेरी सूचनाएं देखें ।


16

एक DTS नौकरी (या एक नौकरी जो एक विंडोज़ सेवा द्वारा शुरू की गई है) करें जो एक निश्चित अंतराल पर चलती है। जब भी इसे चलाया जाता है, यह सिस्टम INFORMATION_SCHEMA तालिकाओं का उपयोग करके दी गई तालिका के बारे में जानकारी प्राप्त करता है, और इस डेटा को डेटा रिपॉजिटरी में दर्ज करता है। पिछली बार दिए गए डेटा के साथ तालिका की संरचना के संबंध में दिए गए डेटा की तुलना करें। यदि यह अलग है, तो आप जानते हैं कि संरचना बदल गई है।

उदाहरण तालिका के सभी स्तंभों के बारे में जानकारी वापस करने के लिए क्वेरी ABC (आदर्श रूप से INFORMATION_SCHEMA तालिका से स्तंभों को सूचीबद्ध करना, जो आप चाहते हैं, इसके बजाय * चयन करें ** जैसे मैं यहाँ हूँ):

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'ABC'

आप विभिन्न स्तंभों और INFORMATION_SCHEMA के विचारों की निगरानी करेंगे कि आप वास्तव में "तालिका में परिवर्तन" कैसे परिभाषित करते हैं।


2
प्रश्न तालिका डेटा में परिवर्तन के बारे में है और सूचना_schema में तालिका का स्कीमा (स्तंभ परिभाषाएँ) हैं।
बहुत

13

यहां जंगली अनुमान: यदि आप तीसरे पक्ष की तालिकाओं को संशोधित नहीं करना चाहते हैं, तो क्या आप एक दृश्य बना सकते हैं और फिर उस दृश्य पर ट्रिगर लगा सकते हैं?


6

अंतिम प्रतिबद्ध तारीख की जाँच करें। प्रत्येक डेटाबेस का इतिहास होता है जब प्रत्येक कमिट किया जाता है। मेरा मानना ​​है कि इसका एक मानक एसीआईडी ​​अनुपालन है।


1
कृपया इस जानकारी को SQL सर्वर
मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.