2008-09-01 10 views
25

डेटाबेस तालिका में परिवर्तनों को ट्रैक करने का सबसे अच्छा तरीका क्या है?डेटाबेस तालिका में डेटा परिवर्तनों को ट्रैक करने के लिए कैसे करें

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

+2

कुछ अच्छी चर्चा: http://discuss.joelonsoftware.com/default.asp?design.4.483891

उदाहरण से ऊपर एसक्यूएल के लिए है, मुझे किसी भी प्रश्न के मामले में पता है या इस लिंक का उपयोग करते हैं .10 –

+0

यह भी देखें [एक चेंजलॉग/ऑडिटिंग डेटाबेस तालिका के लिए सर्वश्रेष्ठ डिज़ाइन?] (Https://stackoverflow.com/questions/201527/best-design-for-a-changelog-auditing-डेटा-table) – user

उत्तर

3

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

ऐसी चीजों का समर्थन करने वाली भाषाओं में aspect-oriented programming इस तरह के एप्लिकेशन के लिए उपयोग करने के लिए एक अच्छी तकनीक हो सकती है। ऑडिटिंग डेटाबेस तालिका परिवर्तन वह प्रकार का ऑपरेशन है जिसे आप आम तौर पर सभी परिचालनों के लिए लॉग करना चाहते हैं, इसलिए एओपी बहुत अच्छी तरह से काम कर सकता है।

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

यह इसे संभालने के लिए संग्रहीत प्रक्रियाओं का उपयोग करने के लिए भी पूरी तरह से व्यवहार्य है, हालांकि डेटाबेस के माध्यम से उपयोगकर्ता प्रमाण-पत्रों को पारित करने में थोड़ा सा काम हो सकता है।

+1

ऐसा लगता है जैसे यदि आप उपयोगकर्ता को अपना इतिहास या अन्य लोगों के इतिहास को देखने की अनुमति देना चाहते हैं तो एक लॉग फ़ाइल उनके लिए बहुत उपयोगी नहीं होगी। –

3

आपके यहां कुछ समस्याएं हैं जो एक-दूसरे से अच्छी तरह से संबंधित नहीं हैं।

मूल डेटाबेस स्तर पर आप एक अलग तालिका रखते हुए परिवर्तन ट्रैक कर सकते हैं जो INSERT/UPDATE/DELETE कथन पर ट्रिगर्स के माध्यम से इसमें प्रविष्टि प्राप्त करता है। डेटाबेस तालिका में परिवर्तनों को ट्रैक करने का सामान्य तरीका है।

दूसरी चीज जो आप चाहते हैं उसे जानना है कि उपयोगकर्ता परिवर्तन आया। आम तौर पर आपके ट्रिगर इसे नहीं जानते। मुझे लगता है कि यदि आप जानना चाहते हैं कि किस उपयोगकर्ता ने डेटा का एक टुकड़ा बदल दिया है तो यह संभव है कि एकाधिक उपयोगकर्ता एक ही डेटा बदल सकें।

ऐसा करने का कोई सही तरीका नहीं है, तो संभवतः आप एक अलग टेबल चाहते हैं कि जब भी कोई उपयोगकर्ता अन्य तालिका में कुछ डेटा अपडेट करता है, जिसमें उपयोगकर्ता, टाइमस्टैम्प और आईडी शामिल होता है तो आपका एप्लिकेशन कोड रिकॉर्ड डाल देगा बदले गए रिकॉर्ड।

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

0

एक अलग तालिका में एक ट्रेस लॉग (एक आईडी कॉलम के साथ, संभवतः टाइमस्टैम्प के साथ)?

क्या आप भी बदलावों को पूर्ववत करना चाहते हैं - शायद पूर्ववत कथन (प्रत्येक INSERT के लिए एक डिलीट, प्रत्येक सामान्य अद्यतन के लिए एक (un-) अद्यतन पूर्व-निर्माण करें और उस ट्रेस में सहेजें?

4

एक विधि जिसे मैंने अक्सर देखा है वह ऑडिट टेबल होना है। फिर आप दिखा सकते हैं कि क्या बदल गया है, क्या बदल गया है और यह क्या बदल गया है, या जो कुछ भी आप चाहते हैं :) फिर आप वास्तविक लॉगिंग करने के लिए एक ट्रिगर लिख सकते हैं। अगर सही तरीके से किया गया तो बहुत दर्दनाक नहीं ...

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

यदि आप डेटाबेस कनेक्शन से उपयोगकर्ता की जानकारी प्राप्त करने में सक्षम नहीं हैं, तो यह थोड़ा दर्द है। और फिर आप ऐप के भीतर लॉगिंग करने पर विचार कर सकते हैं, इसलिए यदि आपके पास "CreateOrder" या जो कुछ भी कहा गया है, तो आप ऑर्डर_ऑडिट टेबल या जो कुछ भी लॉग कर सकते हैं।

ऐप के बाहर से किए गए परिवर्तनों के लिए यह सब कुछ स्वयं को खोलता है, लेकिन यदि आपके पास एक ही डेटा का उपयोग करके कई ऐप्स हैं और आप बस देखना चाहते हैं कि आपके द्वारा किए गए परिवर्तन क्या हैं, शायद यही वही है जो आप चाहते थे ... < शग>

हालांकि, आपको शुभकामनाएं!

1

--Kevin यह एक ही सवाल शोध में, मैं एक चर्चा here बहुत उपयोगी पाया। यह परिवर्तनों को ट्रैक करने के लिए समानांतर तालिका सेट रखने का सुझाव देता है, जहां प्रत्येक परिवर्तन-ट्रैकिंग तालिका में वही कॉलम होते हैं जो यह ट्रैकिंग कर रहा है, साथ ही कॉलम किसने इसे बदल दिया है, कब, और यदि इसे हटा दिया गया है। (यह अपने पूर्व मौजूदा स्क्रिप्ट का एक regexed-अप संस्करण का उपयोग करके के लिए इस अधिक या कम स्वचालित रूप से स्कीमा उत्पन्न करने के लिए संभव हो जाना चाहिए।)

+0

हां - यह एक बहुत अच्छा परिचय/ट्यूटोरियल है –

0

के इस ओपन सोर्स घटक के साथ कोशिश करते हैं:

https://tabledependency.codeplex.com/

तालिका निर्भरता एक सामान्य सी # घटक है जो अधिसूचना प्राप्त करने के लिए उपयोग किया जाता है जब निर्दिष्ट डेटाबेस तालिका की सामग्री बदल जाती है।

-1

यदि सभी php से बदलते हैं। क्वेरी से पहले evry INSERT/UPDATE/DELETE लॉग इन करने के लिए आप class का उपयोग कर सकते हैं। यह उन सभी लोगों को बचाने कार्रवाई, तालिका, स्तंभ, newValue, OLDVALUE, तारीख, प्रणाली (अगर जरूरत), आईपी, UserAgent, clumnReference, operatorReference, valueReference। लॉग इन करने की आवश्यकता वाले सभी टेबल/कॉलम/क्रियाएं कॉन्फ़िगर करने योग्य हैं।

1

मान लीजिए कि मेरे पास 10 कॉलम वाले व्यक्ति तालिका है जिसमें पर्सनलसिड और अपडेटडेट शामिल हैं। अब, मैं व्यक्ति तालिका में किसी भी अद्यतन का ट्रैक रखना चाहता हूं। यहाँ सरल तकनीक मैं प्रयोग किया जाता है:

  1. एक person_log तालिका

    तालिका person_log (तारीख datetime2, sid पूर्णांक) बनाने बनाएं;

    person_log में डालने
    रूप अद्यतन के लिए dbo.Person
    पर ट्रिगर टीआर बनाने की तिथि (,:

  2. जब भी व्यक्ति तालिका अद्यतन हो जाता है कि person_log तालिका में एक पंक्ति सम्मिलित होगा व्यक्ति मेज पर एक ट्रिगर बनाएं sid) updatedDTTM, PersonSID चयन डाला

से अपडेट करने के बाद, person_log तालिका क्वेरी और आप personSid कि अपडेट किए गए हैं को देखने के लिए सक्षम हो जाएगा। वही आप सम्मिलित करने के लिए कर सकते हैं, हटाएं। यहाँ http://www.4guysfromrolla.com/webtech/042507-1.shtml

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