2010-11-08 14 views
5

मैं एक ऑडिट ट्रेल प्रोजेक्ट पर काम कर रहा हूं जहां हमें निम्नलिखित करने के लिए कहा गया है।ऑडिट ट्रेल: वेब एप्लिकेशन

हमारे डीबी में सभी टेबल (200+) को छाया तालिकाओं के साथ ट्रैक करें जैसे कि हाइबरनेट एनवर्क्स करता है। यह इस प्रकार है कि हमने सीयूडी से जुड़े प्रत्येक लेनदेन के लिए स्नैपशॉट बनाया है।

अतीत में, मैंने अपने प्रत्येक क्लाइंट के लिए महत्वपूर्ण डेटा के सीमित सेट के लिए ऑडिट समाधान लागू किए। वर्तमान कार्य के लिए, मेरे प्रश्न हैं:

  1. क्या डेटाबेस में प्रत्येक तालिका का ऑडिट करने के लिए यह समझ में आता है?
  2. Envers जैसे डेटा को ट्रैक करने के लिए कितना मूल्य होगा? कोई भी आवेदन विशिष्ट डेटा बिंदुओं के लिए डेल्टा चाहता है। डेल्टा को समझने के लिए डेटा के विशाल सेट पूछना अवास्तविक प्रतीत होता है।
  3. समाधान जैसे एक समाधान को लेनदेन के साथ सीयूडी कार्यों को प्रभावी ढंग से ट्रिगर करने का निर्णय लेने की आवश्यकता होती है। ऐसा इसलिए है क्योंकि ट्रिगर्स अपने लेन-देन में चलते हैं और इसलिए एप्लिकेशन से लेनदेन रोलबैक के मामले में छाया सारणी में डेटा सिंक से बाहर हो सकता है। मैं यहाँ कुछ भी याद कर रहा हूँ?
  4. क्या कोई ऑडिट ट्रेल के लिए नोएसक्यूएल डीबी का उपयोग करने का सुझाव देता है?

उत्तर

0

नोएसQL डेटाबेस के लिए एक विकल्प RavenDB है, जिसका उपयोग "versioning bundle" है।

हालांकि इस बिंदु पर शायद यह बहुत जल्दी है, मैंने हाल ही में हेर्डिंग कोड के एक दिलचस्प एपिसोड को सुना है जहां वे talk with Eric Sink on about Veracity हैं। जैसा कि मैं समझता हूं, Veracity भाग वितरित संस्करण नियंत्रण प्रणाली है, और भाग NoSQL डेटाबेस है। यह स्रोत नियंत्रण प्रणाली से विकी तक कुछ भी बैकएंड बनने के लिए डिज़ाइन किया गया है। यह कुछ वर्षों के लिए विकास में है, लेकिन अभी भी प्री-बीटा चरणों में प्रभावी है (नवंबर 2010 तक)।

+0

सच्चाई के लिए, मुझे यकीन है कि यह संभव है नहीं कर रहा हूँ: http: //veracity-scm.com/qa/questions/545/how-to-version-database-data -साथ-सत्यता – gpasse

1

पूरी तरह कार्यान्वित और अधिक सुधार किया जा सकता है। मुझे आशा है कि इस मदद मिल सकती है किसी को:

public partial class Entity:DbContext 
    { 

     public enum AuditActions {I,U,D} 

     public override int SaveChanges() 
     { 
      ChangeTracker.DetectChanges(); 
      ObjectContext ctx = ((IObjectContextAdapter)this).ObjectContext; 
      // string UserName = WindowsIdentity.GetCurrent().Name; 
      IPrincipal principal = Thread.CurrentPrincipal; 
      IIdentity identity = principal == null ? null : principal.Identity; 
      string name = identity == null ? "" : identity.Name; 

      //Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity((userName), roles); 
      List<ObjectStateEntry> objectStateEntryList = 
       ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added 
                 | EntityState.Modified 
                 | EntityState.Deleted) 
       .ToList(); 

      List<DBAudit> AuditList = new List<DBAudit>(); 

      string Audittable = string.Empty; 
      foreach (ObjectStateEntry entry in objectStateEntryList) 
      { 
       Audittable = entry.EntitySet.ToString(); 

       if (!entry.IsRelationship && Audittable!="Audit table name") 
       { 

        //sIsAuditTble =entry.EntitySet="DBAudit"? true:false; 
        switch (entry.State) 
        { 
         case EntityState.Added: 
         AuditList= LogDetails(entry, name, AuditActions.I); 
          break; 
         case EntityState.Deleted: 
         AuditList= LogDetails(entry, name, AuditActions.D); 
          break; 
         case EntityState.Modified: 
         AuditList= LogDetails(entry, name, AuditActions.U); 
          break; 

        } 
       } 
      } 



       using (var context = new ProjectTrackerEntities()) 
       { 
        for (int i = 0; i < AuditList.Count; i++) 
        { 
         context.DBAudits.Add(AuditList[i]); 
         context.SaveChanges(); 
        } 
       } 

      return base.SaveChanges(); 
     } 

     public List<DBAudit> LogDetails(ObjectStateEntry entry, string UserName, AuditActions action) 
     { 
      List<DBAudit> dbAuditList = new List<DBAudit>(); 

     if (action == AuditActions.I) 
      { 

       var keyValues = new Dictionary<string, object>(); 
       var currentValues = entry.CurrentValues; 

      // entry.Entity key = new EntityKey(); 

        DBAudit audit = new DBAudit(); 
        audit.AuditId = Guid.NewGuid().ToString(); 
        audit.RevisionStamp = DateTime.Now; 
        audit.TableName = entry.EntitySet.Name; 
        audit.UserName = UserName; 
        audit.OldData = ""; 
        audit.Actions = action.ToString(); 
        for (int i = 0; i < currentValues.FieldCount; i++) 
        { 
        audit.ChangedColumns = audit.ChangedColumns + currentValues.GetName(i); 
        audit.NewData = audit.NewData + currentValues.GetValue(i); 
        audit.ChangedColumns = audit.ChangedColumns + ", "; 
        audit.NewData = audit.NewData + ", "; 
        } 
        dbAuditList.Add(audit); 
        //LogSave(audit); 




      } 
      else if (action == AuditActions.D) 
      { 
       var keyValues = new Dictionary<string, object>(); 
       var DeletedValues = entry.OriginalValues; 

       // entry.Entity key = new EntityKey(); 


       DBAudit audit = new DBAudit(); 
       audit.AuditId = Guid.NewGuid().ToString(); 
       audit.RevisionStamp = DateTime.Now; 
       audit.TableName = entry.EntitySet.Name; 
       audit.UserName = UserName; 
       audit.NewData = ""; 

       audit.Actions = action.ToString(); 
       for (int i = 0; i < DeletedValues.FieldCount; i++) 
       { 
        audit.ChangedColumns = audit.ChangedColumns + DeletedValues.GetName(i); 
        audit.OldData = audit.OldData + DeletedValues.GetValue(i); 
        audit.ChangedColumns = audit.ChangedColumns + ", "; 
        audit.OldData = audit.OldData + ", "; 
       } 
       dbAuditList.Add(audit); 
      } 
      else 
      { 

        foreach (string propertyName in entry.GetModifiedProperties()) 
        { 
         DBAudit audit = new DBAudit(); 
         DbDataRecord original = entry.OriginalValues; 
         string oldValue = original.GetValue(original.GetOrdinal(propertyName)).ToString(); 

         CurrentValueRecord current = entry.CurrentValues; 
         string newValue = current.GetValue(current.GetOrdinal(propertyName)).ToString(); 

         audit.AuditId = Guid.NewGuid().ToString(); 
         audit.RevisionStamp = DateTime.Now; 
         audit.TableName = entry.EntitySet.Name; 
         audit.UserName = UserName; 
         audit.ChangedColumns = propertyName; 
         audit.OldData = oldValue; 
         audit.NewData = newValue; 
         audit.Actions = action.ToString(); 
         dbAuditList.Add(audit); 
         //LogSave(audit); 


        } 

      } 

     return dbAuditList; 


     } 



    } 
+0

एसओ पर आपका स्वागत है, यहां, यह समझाने का एक अच्छा अभ्यास है कि आपके समाधान का उपयोग क्यों करें और न कि कैसे। इससे आपका उत्तर अधिक मूल्यवान हो जाएगा और आप इसे कैसे करते हैं इसकी बेहतर समझ रखने के लिए आगे पाठक की सहायता करेंगे। मैं यह भी सुझाव देता हूं कि आप हमारे अक्सर पूछे जाने वाले प्रश्न देखें: http://stackoverflow.com/faq। – ForceMagic

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

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