यदि आपके पास 10g एंटरप्राइज़ संस्करण है, तो आपको Oracle के फाइन-ग्रेन ऑडिटिंग को देखना चाहिए। यह निश्चित रूप से अपना खुद का रोल करने से बेहतर है।
लेकिन अगर आपके पास कम संस्करण है या किसी कारण से FGA आपके स्वाद के लिए नहीं है, तो यह कैसे करना है। मुख्य बात यह है:प्रत्येक एप्लिकेशन तालिका के लिए एक अलग ऑडिट तालिका बनाएं .
मुझे पता है कि यह वह नहीं है जो आप सुनना चाहते हैं क्योंकि यह आपके द्वारा ऊपर उल्लिखित तालिका संरचना से मेल नहीं खाता है। लेकिन अद्यतन से प्रभावित प्रत्येक स्तंभ के लिए पुराने और नए मानों वाली एक पंक्ति संग्रहीत करना वास्तव में एक बुरा विचार है:
- यह स्केल नहीं करता है (दस कॉलम को छूने वाला एक अपडेट दस इंसर्ट को जन्म देता है)
- जब आप कोई रिकॉर्ड डालते हैं तो क्या होता है?
- किसी भी समय रिकॉर्ड की स्थिति को इकट्ठा करना एक पूर्ण दर्द है
तो, एक समान संरचना के साथ, प्रत्येक एप्लिकेशन टेबल के लिए एक ऑडिट टेबल रखें। इसका मतलब है कि आवेदन तालिका में CHANGED_TIMESTAMP और CHANGED_USER शामिल हैं, लेकिन यह कोई बुरी बात नहीं है।
अंत में, और आप जानते हैं कि यह कहां आगे बढ़ रहा है, प्रत्येक तालिका पर एक ट्रिगर है जो ऑडिट तालिका में केवल:नए मानों के साथ एक संपूर्ण रिकॉर्ड सम्मिलित करता है। ट्रिगर INSERT और UPDATE पर सक्रिय होना चाहिए। यह पूरा इतिहास देता है, रिकॉर्ड के दो संस्करणों को अलग करना काफी आसान है। DELETE के लिए आप एक ऑडिट रिकॉर्ड डालेंगे जिसमें केवल प्राथमिक कुंजी भरी हुई होगी और अन्य सभी कॉलम खाली होंगे।
आपकी आपत्ति यह होगी कि इन सभी वस्तुओं को लागू करने के लिए आपके पास बहुत अधिक टेबल और बहुत सारे कॉलम हैं। लेकिन डेटा डिक्शनरी (user_tables, user_tab_columns) से टेबल जेनरेट करना और DDL स्टेटमेंट को ट्रिगर करना काफी आसान है।