2008-11-05 6 views
21

मैं पता लगा सकते हैं जब पिछले सम्मिलित करें, अद्यतन या बयान DELETE एक Oracle डेटाबेस में एक मेज पर प्रदर्शन किया गया था और यदि हां, तो कैसे अद्यतन किया गया था?कैसे पता लगाने के लिए जब एक Oracle तालिका पिछली बार

एक छोटी सी पृष्ठभूमि: Oracle संस्करण 10 ग्राम है। मेरे पास एक बैच एप्लिकेशन है जो नियमित रूप से चलता है, एकल ओरेकल तालिका से डेटा पढ़ता है और इसे एक फ़ाइल में लिखता है। अगर नौकरी दौड़ने के आखिर में डेटा नहीं बदला है तो मैं इसे छोड़ना चाहता हूं।

आवेदन सी ​​में लिखे ++ और ओसीआई के माध्यम से ओरेकल के साथ संचार कर रहा है। यह ओरेकल में "सामान्य" उपयोगकर्ता के साथ लॉग इन करता है, इसलिए मैं किसी विशेष व्यवस्थापक सामग्री का उपयोग नहीं कर सकता।

संपादित करें: ठीक है, "विशेष व्यवस्थापक स्टफ" बिल्कुल अच्छा वर्णन था। मेरा मतलब है: मैं टेबल से चयन करने और संग्रहित प्रक्रियाओं को कॉल करने के अलावा कुछ भी नहीं कर सकता। डेटाबेस के बारे में कुछ भी बदलना (ट्रिगर जोड़ने की तरह), 2010 से पहले इसे हासिल करना चाहते हैं, तो दुख की बात नहीं है।

+0

हां ... 2010 की टिप्पणी आपके डीबीए की धीमी गति के बारे में है, मैं इसे लेता हूं? –

+0

ठीक है, तरह का। वे धीमे हैं, लेकिन जैसा कि मैंने पहले की टिप्पणी में कहा था, मैं उन्हें समझता हूं। अगर इस डेटाबेस में कोई समस्या है तो यह वास्तव में बदसूरत है, वास्तव में तेज़ है। आप वहां सामान प्राप्त कर सकते हैं, लेकिन लोगों के समूह द्वारा नरक में इसका विश्लेषण करने के बाद ही। – Maximilian

उत्तर

35

जब से तुम 10 ग्राम पर कर रहे हैं, आप संभावित ORA_ROWSCN pseudocolumn इस्तेमाल कर सकते हैं। इससे आपको अंतिम एससीएन (सिस्टम चेंज नंबर) की ऊपरी सीमा मिलती है जिससे पंक्ति में बदलाव आया। चूंकि यह एक बढ़ता अनुक्रम है, इसलिए आप देखे गए अधिकतम ORA_ROWSCN को स्टोर कर सकते हैं और उसके बाद केवल उस से अधिक एससीएन वाले डेटा के लिए देख सकते हैं।

डिफ़ॉल्ट रूप से, ORA_ROWSCN वास्तव में ब्लॉक स्तर पर बनाए रखा जाता है, इसलिए ब्लॉक में किसी भी पंक्ति में परिवर्तन ब्लॉक में सभी पंक्तियों के लिए ORA_ROWSCN बदल देगा। यदि संभवतः यदि हम "सामान्य" डेटा पहुंच पैटर्न के बारे में बात कर रहे हैं तो कोई बदलाव नहीं होने पर पंक्तियों की संख्या को कम करने के लिए यह संभवतः पर्याप्त है।आप तालिका को ROWDEPENDENCIES के साथ पुनर्निर्माण कर सकते हैं जो पंक्ति स्तर पर ट्रैक किए जाने के लिए ORA_ROWSCN का कारण बनता है, जो आपको अधिक बारीक जानकारी देता है लेकिन तालिका को पुनर्निर्माण के लिए एक बार प्रयास करने की आवश्यकता होती है।

एक और विकल्प चेंज डेटा कैप्चर (सीडीसी) जैसे कुछ को कॉन्फ़िगर करना होगा और अपने ओसीआई एप्लिकेशन को तालिका में बदलाव के लिए एक ग्राहक बनाना होगा, लेकिन सीडीसी को कॉन्फ़िगर करने के लिए एक बार प्रयास करने की भी आवश्यकता है।

+0

वाह, यह वाकई अच्छा है। मैंने उस छद्मकोल को याद किया है। लेकिन मैं सीडीसी का उपयोग नहीं करता ... अपने उद्देश्यों के लिए रास्ता बहुत जटिल है। मैं डीसीएन (डाटाबेस चेंज अधिसूचना) का उपयोग करता हूं। –

+0

धन्यवाद! भी बहुत उपयोगी है। – Maximilian

+1

एक पंक्ति को हटाया गया है? मैं कैसे पता लगाऊं? –

1

आपको किसी अन्य तालिका में एक मान सेट करने, डालने, हटाने, हटाने पर एक ट्रिगर जोड़ने की आवश्यकता होगी sysdate करने के लिए।

जब आप एप्लिकेशन को चलाने के लिए, यह मूल्य पढ़ सकते हैं और इसे कहीं बचाने ताकि अगली बार जब यह तुलना करने के लिए एक संदर्भ है चलाया जाता है जाएगा।

आपको लगता है कि "विशेष व्यवस्थापक सामग्री" पर विचार करेंगे?

बेहतर होगा कि आप वास्तव में क्या कर रहे हैं का वर्णन करने के ताकि आप स्पष्ट उत्तर प्राप्त करें।

5

आपको लगता है कि स्थानीय स्तर पर परिणाम पर किसी प्रकार की जांच योग और दुकान चलाते सकते हैं? फिर जब आपका एप्लिकेशन डेटाबेस से पूछताछ करता है, तो आप इसकी जांच की तुलना कर सकते हैं और यह निर्धारित कर सकते हैं कि आपको इसे आयात करना चाहिए या नहीं?

ऐसा लगता है कि यह पूरा करने के ORA_HASH समारोह उपयोग करने में सक्षम हो सकता है।

अद्यतन: एक और अच्छा संसाधन: 10g’s ORA_HASH function to determine if two Oracle tables’ data are equal

+0

यह आशाजनक लग रहा है। धन्यवाद! – Maximilian

+0

शुभकामनाएँ :) (मैं इसे अपने "टूल बॉक्स" में भी जोड़ दूंगा, इसलिए मैंने कुछ नया भी सीखा!) – mwilliams

+0

दिलचस्प लगता है। क्या आप एक टेबल के लिए हैश बनाने का एक उदाहरण शामिल कर सकते हैं? –

1

कब तक बैच प्रक्रिया फ़ाइल में लिखने का लगता है? इसे आगे बढ़ने के लिए सबसे आसान हो सकता है और फिर फ़ाइल को पिछली दौड़ से फ़ाइल की प्रतिलिपि के विरुद्ध तुलना करने के लिए तुलना करें कि वे समान हैं या नहीं।

+0

यह समस्या है: मैं केवल डेटा नहीं लिखता लेकिन मुझे इसे जटिल तरीके से संसाधित करने की आवश्यकता है। इसमें कई घंटे लगते हैं और यह मैं बचने की कोशिश कर रहा हूं। – Maximilian

9

लेखा परीक्षा के बारे में अपनी डीबीए पूछो। उन्होंने कहा कि जैसे एक सरल कमांड के साथ एक लेखा परीक्षा शुरू कर सकते हैं:

AUDIT INSERT ON user.table 

फिर आप तालिका USER_AUDIT_OBJECT क्वेरी निर्धारित करने के लिए यदि पिछले निर्यात के बाद से अपनी मेज पर एक डालने कर दिया गया है सकते हैं। अधिक जानकारी के लिए ओरेकल लेखा परीक्षा के लिए

गूगल ...

+1

धन्यवाद। मुझे लगता है कि यह वही तरीका है जिसे यह माना जा सकता है। अफसोस की बात है, "डीबीए पूछना" अपेक्षाकृत जटिल है। वे सामान बदलने के बारे में वास्तव में पागल हैं। मैं उन्हें समझता हूँ। अगर इस डीबी के साथ कुछ भी गलत है, तो चीजें बदसूरत हो जाती हैं। – Maximilian

3

ओरेकल परिवर्तनों के लिए तालिकाओं को देख सकता है और जब कोई परिवर्तन होता है तो पीएल/एसक्यूएल या ओसीआई में कॉलबैक फ़ंक्शन निष्पादित कर सकता है। कॉलबैक एक ऑब्जेक्ट प्राप्त करता है जो टेबल का संग्रह होता है जो बदल जाता है, और इसमें पंक्ति का संग्रह होता है जो बदल जाता है, और एक्शन, इन्स, अपडेट, डेल।

तो आप टेबल पर भी नहीं जाते हैं, आप बैठते हैं और कॉल करने की प्रतीक्षा करते हैं। लिखने में बदलाव होने पर आप केवल तभी जाएंगे।

इसे Database Change Notification कहा जाता है। जस्टिन के रूप में सीडीसी की तुलना में यह बहुत आसान है, लेकिन दोनों को कुछ फैंसी एडमिन सामान की आवश्यकता है। अच्छा हिस्सा यह है कि इनमें से किसी को भी आवेदन में बदलाव की आवश्यकता नहीं है।

चेतावनी यह है कि सीडीसी उच्च मात्रा तालिकाओं के लिए ठीक है, डीसीएन नहीं है।

+0

एफडब्ल्यूआईडब्ल्यू, मैंने हाल ही में सीक्यूएन (यानी सीडीएन) की खोज की है जो 12 सी के पीडीबी पर समर्थित नहीं है। उम्मीद है कि यह भविष्य में होगा। – ddevienne

38

मैं वास्तव में इस पार्टी के लिए देर हो रही है, लेकिन यहाँ मैं इसे कैसे किया है:

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable; 

यह मेरी प्रयोजनों के लिए पर्याप्त करीब है।

+4

आपकी तालिका में अंतिम अपडेट के रूप में लंबे समय तक काम नहीं करता है। वरना आपको कोई त्रुटि मिलती है, तो यह पहली बार एक सबसे सुरक्षित है: छोड़ दिया myTable.ora_rowscn <= tiemposmax.scn पर tiemposmax sys.smon_scn_time में शामिल होने और उसके बाद अपनी मेज के लिए ora_rowscn तभी भी मिलान होने पर यदि SCN_TO_TIMESTAMP लागू होते हैं।अन्यथा आप sys.smon_scn_time से SCN_TO_TIMESTAMP (MIN (SCN)) को प्रदर्शित कर सकते हैं, जितनी जल्दी पहले तालिका संशोधित की गई थी। –

-3

select * from all_objects ao where ao.OBJECT_TYPE = 'TABLE' and ao.OWNER = 'YOUR_SCHEMA_NAME' 
+0

-1: यह प्रश्न का समाधान नहीं करता है। –

+0

आपने प्रश्न को विभिन्न दिशा –

6
SELECT * FROM all_tab_modifications; 
+0

पर संबोधित किया है, इसके लिए आपको पहले टेबल पर आंकड़े इकट्ठा करने की आवश्यकता होगी, क्योंकि यह केवल अंतिम एकत्र आंकड़ों के बाद परिवर्तन दिखाता है। – Superdooperhero

0

नीचे बयान का उपयोग करें किसी भी एक अभी भी एक जवाब वे Oracle Database Change Notification सुविधा Oracle 10g के साथ आ रहा है का उपयोग कर सकते के लिए देख रहा है, तो। इसे CHANGE NOTIFICATION सिस्टम विशेषाधिकार की आवश्यकता है। आवेदन पर वापस अधिसूचना ट्रिगर करने के लिए आप श्रोताओं को पंजीकृत कर सकते हैं।

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