2008-08-19 12 views
15

में डेटा ऑडिटिंग मैं एक परियोजना पर NHibernate का उपयोग कर रहा हूं और मुझे डेटा ऑडिटिंग करने की आवश्यकता है। मुझे कोडप्रोजेक्ट पर this article मिला जो IInterceptor इंटरफ़ेस पर चर्चा करता है।NHibernate और SqlServer

ऑडिटिंग डेटा का आपका पसंदीदा तरीका क्या है? क्या आप डेटाबेस ट्रिगर्स का उपयोग करते हैं? क्या आप लेख में डिकस किए गए कुछ के समान कुछ उपयोग करते हैं?

उत्तर

14

NHibernate 2.0 के लिए, आपको Event Listeners पर भी देखना चाहिए। ये IInterceptor इंटरफ़ेस का विकास है और हम उन्हें ऑडिटिंग के लिए सफलतापूर्वक उपयोग करते हैं।

3

मैं आपके द्वारा उल्लिखित कोडप्रोजेक्ट दृष्टिकोण को प्राथमिकता देता हूं।

डेटाबेस ट्रिगर्स के साथ एक समस्या यह है कि यह आपके SQL सर्वर तक पहुंच के रूप में ActiveDirectory के साथ एकीकृत सुरक्षा का उपयोग करने के अलावा आपको कोई विकल्प नहीं छोड़ता है। इसका कारण यह है कि आपके कनेक्शन को कनेक्शन की शुरुआत करने वाले उपयोगकर्ता की पहचान का उत्तराधिकारी होना चाहिए; यदि आपका एप्लिकेशन नामित "sa" खाता या अन्य उपयोगकर्ता खातों का उपयोग करता है, तो "उपयोगकर्ता" फ़ील्ड केवल "sa" को प्रतिबिंबित करेगा।

यह एप्लिकेशन के प्रत्येक उपयोगकर्ता के लिए एक नामित SQL सर्वर खाता बनाकर ओवरराइड किया जा सकता है, लेकिन यह गैर-इंट्रानेट, सार्वजनिक सामना करने वाले वेब अनुप्रयोगों के लिए अव्यवहारिक होगा, उदाहरण के लिए।

+1

प्रत्येक उपयोगकर्ता किसी SQL खाते दे रही है या एकीकृत प्रमाणन का उपयोग करने वाले कामकाज/विकल्प हैं। आपके टेबल पर "LastUpdatedByUser" कॉलम ऑडिट किया जा सकता है और जब भी आप एक रिकॉर्ड अपडेट करते हैं तो उसे ऐप से भेज दें। ट्रिगर ऑडिट रिकॉर्ड को पॉप्युलेट करने के लिए उस कॉलम के मान का उपयोग कर सकता है। –

5

[संपादित करें]

पोस्ट NH2.0 रिहाई, कृपया घटना श्रोता पर नीचे के रूप में सुझाव दिया है। मेरा जवाब पुराना है।


IInterceptor गैर-आक्रामक फैशन में निबर्ननेट में किसी भी डेटा को संशोधित करने का अनुशंसित तरीका है। यह आपके एप्लिकेशन कोड को जानने के बिना डेटा के डिक्रिप्शन/एन्क्रिप्शन के लिए भी उपयोगी है।

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

मैं कुछ बड़े सिस्टम में ऑडिटिंग प्रदान करने के लिए उत्पादन कोड में इंटरसेप्टर्स का उपयोग करता हूं।

+0

क्या मुझे IInterceptor समाधान के साथ थोड़ा समस्याग्रस्त लगता है, यह है कि उदाहरण के लिए 'LastUpdated' दिनांक क्लाइंट वर्कस्टेशन पर सेट की गई तारीख पर सेट है, और यह उपयोग किए जाने वाले डीबी सर्वर की तारीख नहीं है। –

3

मुझे इंटरसेप्टर दृष्टिकोण का उल्लेख है, और इस परियोजना पर इसका उपयोग करें जो मैं वर्तमान में काम कर रहा हूं।

हालांकि, हाइलाइटिंग के योग्य एक स्पष्ट नुकसान यह है कि यह दृष्टिकोण केवल आपके आवेदन के माध्यम से किए गए डेटा परिवर्तनों का लेखा परीक्षा करेगा। किसी भी प्रत्यक्ष डेटा संशोधन जैसे कि विज्ञापन-समय एसक्यूएल स्क्रिप्ट जिन्हें आपको समय-समय पर निष्पादित करने की आवश्यकता हो सकती है (यह हमेशा होता है!) का ऑडिट नहीं किया जाएगा, जब तक कि आप एक ही समय में ऑडिट तालिका प्रविष्टियां निष्पादित न करें।

2

एक पूरी तरह से अलग दृष्टिकोण के रूप में, आप सजावट पैटर्न को अपने भंडारों के साथ उपयोग कर सकते हैं।

मैं

public interface IRepository<EntityType> where EntityType:IAuditably 
{ 
    public void Save(EntityType entity); 
} 

तब है कहो, हम अपने NHibernateRepository होगा:

public class AuditingRepository<EntityType>:IRepository<EntityType> 
{ 
    /*...*/ 
    public void Save (EntityType entity) 
    { 
     entity.LastUser = security.CurrentUser; 
     entity.LastUpdate = DateTime.UtcNow; 
     innerRepository.Save(entity) 
    } 
} 

फिर, एक आईओसी का उपयोग कर:

public class NHibernateRepository<EntityType>:IRepository<EntityType> 
{ 
    /*...*/ 
    public void Save (EntityType entity) 
    { 
     session.SaveOrUpdate(entity); 
    } 
} 

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

बेशक

, तुम कैसे सोपानी संग्रह के तत्वों को ऑडिट पूरी तरह ...

+0

मुझे नहीं लगता कि यह सही समाधान है जब तक आप स्पष्ट रूप से सहेजते हैं और किसी भी तरह से एनएच के फ्लश व्यवहार को अक्षम करते हैं। अर्थात। विधि को बचाने के लिए कॉल के बिना भी एक इकाई में परिवर्तन जारी रखा जा सकता है! – Rashack

+0

आप सत्र का उपयोग कर रहे हैं। फ्लशमोड = FlushMode.Commit केवल? –

+0

यदि आप यह काम कर रहे थे तो आप डेटाबेस पर होने वाले अपडेट के साथ समाप्त हो जाएंगे जहां इस दृष्टिकोण का उपयोग करने में कोई बदलाव नहीं है। –

3

मैं समझता हूँ कि यह एक पुराने सवाल यह है कि एक और मुद्दा है। लेकिन मैं एनएच 2.0 में नई इवेंट सिस्टम के प्रकाश में इसका उत्तर देना चाहता हूं। इवेंट श्रोताओं इंटरसेप्टर की तुलना में ऑडिटिंग-जैसी-फ़ंक्शंस के लिए बेहतर हैं। आयेंडे ने पिछले महीने अपने ब्लॉग पर एक महान उदाहरण लिखा था। यहाँ अपने ब्लॉग पोस्ट करने के लिए यूआरएल है -

ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx