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

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

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

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

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


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

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

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

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

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

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

0
जोड़ा संपादित
विचारों: 28
वे अपनी पंक्तियों पर आखिरी संशोधित टाइमस्टैम्प लगाने के लिए नहीं हुए थे, है ना?
जोड़ा लेखक zmbq, स्रोत

8 उत्तर

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

0
जोड़ा

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

0
जोड़ा

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

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

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

आप "तालिका में परिवर्तन" को परिभाषित करने के तरीके के आधार पर अलग-अलग कॉलम और INFORMATION_SCHEMA दृश्यों की निगरानी करेंगे।

0
जोड़ा
प्रश्न तालिका डेटा में परिवर्तनों के बारे में है और info_schema में तालिका के स्कीमा (कॉलम परिभाषाएं) शामिल हैं।
जोड़ा लेखक too, स्रोत

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

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

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

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

0
जोड़ा

चेक्सम कमांड पर एक नज़र डालें:

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

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

चेक

Here's how I used it to rebuild cache dependencies when tables changed:
ASP.NET 1.1 database cache dependency (without triggers)

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

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

0
जोड़ा

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

0
जोड़ा

Unfortunately CHECKSUM does not work always properly to detect changes. It is only a primitive checksum and no CRC calculation. Therefore you can't use it to detect all changes, e. g. symmetrical changes result in the same 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!
0
जोड़ा
यह वास्तव में एक जवाब नहीं है, यह एक "आपका सुझाव काम नहीं करता है"।
जोड़ा लेखक kristianp, स्रोत
BINARY_CHECKSUM से पहले डिस्केट कीवर्ड का उपयोग करके डुप्लीकेट डेटा के लिए इसका उपचार किया जा सकता है। यहां पर चर्चा की गई कुछ अन्य समस्याएं हैं लेकिन बिल्कुल आम नहीं हैं परिदृश्यों।
जोड़ा लेखक pblack, स्रोत