2011-05-13 6 views
6

मैंने बहुत समय खोजा है और अभी तक कोई समाधान नहीं मिला है। यह सवाल थोड़ा सा विषयपरक है। लेकिन मुझे वास्तव में इस कार्य के लिए एक अच्छा समाधान चाहिए।कई एसक्यूएल टेबल्स के लिए एक परिवर्तन इतिहास बनाने के लिए सबसे अच्छा समाधान

मेरे पास वॉल्यूम, सुरक्षा और बहुत अधिक जानकारी के साथ एक टेबल है। यह डेटा दैनिक बदल दिया गया है। अब मुझे को इस परिवर्तन को इतिहास में रखें

ऐसा करने का सबसे अच्छा समाधान क्या है? एक ही संरचना के साथ दूसरी तालिका बनाना और बस इस तालिका में "पुराना" डेटा डालें? या स्थिति के साथ बस एक अतिरिक्त पैरामीटर बना रहे हैं?

इस सर्वर को ट्रिगर्स के साथ बनाना? या LINQ प्रक्रिया के साथ प्रोग्रामेटिक रूप से?

उत्तर

5

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

चूंकि अद्यतन प्रभावी ढंग से एक डिलीट है और फिर एक डालने के बाद, आप एक ट्रिगर के साथ क्या सुझाव दिया गया है, यह हासिल कर सकते हैं- यही हमने किया है।

  • वास्तव में अपने मौजूदा तालिका से मेल खाने एक तालिका बनाएं, लेकिन कुछ जोड़ा कॉलम के साथ: AUDIT_GUID VARCHAR (40), AUDIT_TIMESTAMP DATETIME, AUDIT_ACTION VARCHAR (20)

  • एक "के बाद सम्मिलित करें बनाएँ, हटाएं, अद्यतन करें "निम्न सामान्य पैटर्न का उपयोग करके ट्रिगर करें (जहां आवश्यक हो वहां अधिक कॉलम जोड़ें)।

    CREATE TRIGGER CustomerAudit ON Customer 
    AFTER INSERT,DELETE,UPDATE AS 
    BEGIN 
        IF (TRIGGER_NESTLEVEL()>1) RETURN 
    
        DECLARE @Time DateTime = CURRENT_TIMESTAMP 
        DECLARE @Audit_GUID varchar(100) = NEWID() 
    
        INSERT INTO Customer_History (FirstName, LastName, Audit_Date, Audit_Action, Audit_GUID) 
        SELECT 
         FirstName, LastName, @Time, 'Delete', @Audit_GUID 
        FROM 
         Deleted 
    
        INSERT INTO Customer_History 
    (FirstName, LastName, Audit_Date, Audit_Action, Audit_GUID) 
        SELECT 
         FirstName, LastName, @Time, 'Insert', @Audit_GUID 
        FROM 
         Inserted 
    END 
    

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

+0

(यदि कोई सुझाव दे सकता है कि मैं इस कोड को सही तरीके से प्रारूपित करने के लिए स्टैक ओवरव्लो कैसे प्राप्त कर सकता हूं, तो कृपया मुझे बताएं) – Runonthespot

+0

@Runonthespot: बुलेट के बाद कोड को सही प्रारूपित करने के लिए 8 प्रमुख रिक्त स्थान की आवश्यकता है। मैंने कॉलम सूचियों में अल्पविराम के बाद एक जगह भी जोड़ा, जो कि "अनचाहे" लंबी लाइनों में मदद करने के लिए प्रतीत होता है। –

+0

@Catcall, बहुत धन्यवाद। – Runonthespot

1

मुझे लगता है कि आवश्यक फ़ील्ड और तिथि के साथ इतिहास को ट्रैक करने के लिए एक अलग तालिका बनाने के लिए बेहतर है, ताकि आप इस तालिका को आवश्यकतानुसार पूछ सकें। आप लॉग इन करने के लिए ट्रिगर्स का उपयोग कर सकते हैं।

2

मैं ON DELETE/ON UPDATE ट्रिगर का चयन करता हूं जो किसी दूसरी तालिका में हटाए गए या संशोधित पंक्तियों को संग्रहीत करता है।

इस तरह आप

  • रेफेरेंन्शिअल सत्यनिष्ठा
  • अपने "लाइव डेटा" तालिका में समझदार अद्वितीय कुंजी का निर्माण कर सकते बने रह सकते हैं
  • साथ WHERE IsDeleted = 'N' जोड़ने (या) की तरह याद करने की जरूरत नहीं है प्रत्येक जिज्ञासा आप
  • अपने डेटा के साथ स्वत: historization है भले ही आप इसे सीधे डेटाबेस पर संशोधित कर

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

+0

आप लाइव और ऐतिहासिक डेटा को गठबंधन करने के लिए 'यूनियन ऑल' का उपयोग करके एक दृश्य बना सकते हैं। –

+0

हे टोमालक। आपके उत्तर के लिए बहुत धन्यवाद। यह वास्तव में मुझे मेरे अगले चरणों के लिए बहुत मदद मिली – SwissGuy

+0

@SwissGuy: खुशी है कि मैं आपकी मदद कर सकता हूं। :) – Tomalak

0

मैं सभी डेटा के साथ एक ऐतिहासिक तालिका (प्रत्यय _HIST) बनाने का सुझाव देता हूं। अद्यतन, डिलीवरी और सम्मिलन को स्टोर करने के लिए आपको तीन ट्रिगर्स की आवश्यकता है।

0

बिल्ड न करें जो आप शेल्फ से नहीं खरीद सकते हैं। डेटाबेस ऑडिटिंग सॉफ्टवेयर के लिए Google, वहां बहुत कुछ है।

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