2009-06-26 13 views
32

मैं अपने डीबी में डेटा का लॉग कैसे रख सकता हूं?ऑडिट ट्रेल्स कैप्चर करने के लिए डेटाबेस डिज़ाइन पर विचार

मुझे प्रत्येक पंक्ति में किए गए प्रत्येक परिवर्तन का लॉग बनाए रखना है। इसका मतलब है कि मैं प्रदर्शन करने के लिए DELETE और UPDATE की अनुमति नहीं दे सकता।

मैं ऐसा लॉग कैसे रख सकता हूं?

उत्तर

19

उपयोग "डालें केवल डेटाबेस"

मूल विचार यह है कि आप कभी भी अपडेट नहीं या डेटा को हटाने है।

प्रत्येक तालिका में और से से 2 डेटाटाइम कॉलम है।

वे एक में मान शून्य के साथ शुरू (समय की शुरुआत समय के अंत तक)

जब आप आप करने के लिए अद्यतन एक ही समय में "परिवर्तन" पंक्ति आपको एक नई पंक्ति जोड़ें करने की जरूरत है पिछली पंक्ति में अब और से पंक्ति में जो आप अभी जोड़ रहे हैं।

आप तालिका के बाहर डेटा को उस दृश्य के माध्यम से पढ़ते हैं जिसमें उसमें = null है।

यह विधि आपको किसी भी समय अपने डेटाबेस की स्थिति की एक तस्वीर भी देती है।

संपादित

बस टिप्पणी के जवाब में स्पष्ट करने के लिए: अनुक्रम तालिका के प्राथमिक कुंजी है, जो एक autoincrement संख्या होगी द्वारा दी जायेगी।

+2

क्या यह अंतरिक्ष का एक बड़ा अपशिष्ट नहीं है? – Kolten

+15

यदि आपको डेटा की आवश्यकता है, तो आपको ऑडिट ट्रेल की आवश्यकता होने पर आप क्या करते हैं, यह बर्बाद नहीं होता है। – nos

+4

मैं किसी भी आईडी/खोज डेटा या किसी भी अनुक्रम डेटा के लिए दिनांक समय कॉलम के साथ नहीं जाऊंगा। सिस्टम दिनांक किसी भी कारण या एकाधिक ऑपरेशन के लिए बदल सकता है, एक ही दिनांक/समय मूल्य के संकल्प के साथ ही दोनों संभव हो सकते हैं। यदि आपको समय-समय पर अनुक्रम को कैप्चर करने की आवश्यकता है (गारंटीकृत अद्वितीय) या लंबे पूर्णांक का उपयोग करें या ग्रिड का उपयोग करें क्योंकि आपका भी एक श्रृंखला बनाता है (लेकिन आप एक सूचना आइटम के रूप में समय खो देते हैं - नीचे उत्तर भी पढ़ते हैं ...) –

2

देखें कि क्या किसी अन्य डेटाबेस लॉगिंग प्रश्न के मेरे उत्तर में आपकी आवश्यक जानकारी है। इसे यहां प्राप्त करें ... के रूप में शिराज भाजी द्वारा वर्णित

History tables pros, cons and gotchas - using triggers, sproc or at application level

10

, एक "केवल डालने" डेटाबेस का उपयोग करें, लेकिन आप एक सरल तकनीक का उपयोग कर सकते हैं। ऑडिट डेटा को बनाए रखने के लिए आपको आवश्यक प्रत्येक तालिका के लिए, अभी अपडेट करने के लिए अपडेट किए गए समय के लिए एक अतिरिक्त कॉलम है। जब आप किसी रिकॉर्ड में परिवर्तन करते हैं, तो अपडेट करने के बजाय, बस अपने सभी डेटा के साथ एक डालें; अपडेटेडटाइम कॉलम को वर्तमान समय मिलेगा।

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

इस तकनीक का आपको टेबल पर प्रत्येक रिकॉर्ड के लिए ऐतिहासिक डेटा की एक ज्ञात श्रृंखला देने का लाभ है (प्रत्येक रिकॉर्ड किसी दिए गए समय के लिए मान्य है यदि यह रिकॉर्ड का शीर्ष 1 है जहां TimeOfInterest> अपडेटेडटाइम ऑर्डर द्वारा अपडेटेडटाइम डीईएससी) कम ओवरहेड (तालिका पर केवल एक ही कॉलम) के साथ। यह एक विधि को उपयोग करने के लिए एक साधारण वैकल्पिक तालिका के साथ इस विधि का उपयोग न करने वाले तालिकाओं से रूपांतरण के लिए भी काफी अनुकूल है (जिसे आप लगातार नाम दे सकते हैं)। फिर आपको अपनी मौजूदा बाधाओं और अपडेटेडटाइम कॉलम के समग्र उपयोग करने के लिए अपनी अनूठी बाधाओं को बदलने की आवश्यकता है, और कुछ प्रश्नों को बदलने की आवश्यकता होगी।

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

4

एक पूरी तरह से अलग दृष्टिकोण केवल लेखा परीक्षा लॉग है। फिर आप इसका उपयोग अपने डेटा का सबसे वर्तमान संस्करण बनाने के लिए करते हैं। आप समय-समय पर "चेकपॉइंट्स" बनाते हैं या इसे गति देने के लिए कैशिंग का उपयोग करते हैं।

इस तकनीक का उपयोग कर किसी के बारे में एक प्रस्तुति है: http://www.infoq.com/presentations/greg-young-unshackle-qcon08। यहां बड़ा फायदा यह है कि चूंकि आपके पास केवल ऑडिट लॉग है, इसलिए आपको पूरा भरोसा होगा कि आपका ऑडिट ट्रेल सही है।

मैंने कभी यह कोशिश नहीं की है और यह बहुत जटिल लगता है ... लेकिन कुछ सोचने के लिए।

15

[देर के बाद, लेकिन यह दो तकनीकों नहीं पहले से ही यहाँ उल्लेख कहते हैं] लेनदेन लॉग पढ़ना

- कि इस्तेमाल किया जा सकता उपयोगी जानकारी का एक बहुत कुछ अपने डेटाबेस पूरी वसूली मोड में है, तो फिर लेन-देन लॉग भंडार प्रत्येक पंक्ति का इतिहास देखने के लिए। डाउनसाइड यह है कि यह डिफ़ॉल्ट रूप से समर्थित नहीं है। Change data capture अनिवार्य रूप से ऊपर दिखाए गए की तरह एक ही बात करता है, लेकिन यह अधिक सुव्यवस्थित है और थोड़ा उपयोग में आसान - आप इस तरह के ApexSQL Log

के रूप में उपयोग करते हुए बदलें डाटा कैप्चर गैर-दस्तावेजी कार्यों बी सी सी लॉग इन करें या fn_dblog या तीसरे पक्ष के उपकरण का उपयोग कर सकते हैं। दुर्भाग्य से यह केवल एंटरप्राइज़ संस्करण में उपलब्ध है।

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

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