2012-01-10 18 views
5

पर सभी सम्मिलित/अपडेट लिखने के लिए मैं एक टेबल पर एक ट्रिगर रखना चाहता हूं जो बाहरी उपकरण के साथ प्रोसेसिंग के लिए एक अतिरिक्त लॉग फ़ाइल में सभी डाले गए/अपडेट किए गए डेटा लिखता है।ओरेकल ट्रिगर फ़ाइल

क्या इसे पूरा करने का एक तरीका है?

+1

आप एक लॉग तालिका में पहले से सम्मिलित अद्यतन ट्रिगर का उपयोग करना चाह सकते हैं, और उसके बाद बाद में बैच फैशन (प्रत्येक रात, जो भी हो) में प्रसंस्करण के लिए निकालें। एक "action_date" दिनांक फ़ील्ड (या टाइमस्टैम्प) जोड़ना सुनिश्चित करें जिसे आप बाद में उपयोग/अद्यतन होने पर आधारित डेटा को चुनने के लिए उपयोग कर सकते हैं। – tbone

+0

धन्यवाद tbone, यह एक अच्छा समाधान होगा। लेकिन एप्लिकेशन को बदले बिना, मुझे लगता है कि मुझे टेबल पर अपडेट ट्रिगर डालना होगा, उस कॉलम पर देर से एक अतिरिक्त "अंतिम अपडेट/चेंज कॉलम" जोड़ें। या इसके लिए विशेषता में एक इमारत का निर्माण किया है? – user85155

उत्तर

5

आपको तालिका पंक्ति के बाद निष्पादित ट्रिगर बनाने की आवश्यकता है और UTL_FILE पैकेज का उपयोग कर लॉग फ़ाइल में लिखना है।

UTL_FILE पैकेज की जानकारी यहां पाया जा सकता: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

और उत्प्रेरक प्रलेखन यहां पाया जा सकता: http://bytes.com/topic/oracle/answers/762007-trigger-output-text-file

: http://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg13trg.htm

तुम यहाँ के लिए क्या देख रहे करने के लिए इसी तरह की एक जवाब नहीं है

पीएल/एसक्यूएल का उपयोग कर फ़ाइल में लिखने के बारे में अधिक जानकारी: http://www.devshed.com/c/a/Oracle/Writing-to-Text-Files-in-Oracle-PLSQL/

उम्मीद है कि यह मदद करता है ...

+1

@tbone टिप्पणी के रूप में, आप ट्रिगर से पहले अधिक कुशल हैं क्योंकि वे ट्रिगर्स के बाद अधिक कुशल हैं - ऑरैकल डॉक्स से: पंक्ति ट्रिगर्स के बाद पंक्ति ट्रिगर्स के बाद थोड़ा अधिक कुशल होते हैं। पंक्ति ट्रिगर के बाद, ट्रिगर के लिए एक बार ट्रिगर के लिए प्रभावित डेटा ब्लॉक को पढ़ना चाहिए (तार्किक पढ़ना, भौतिक पढ़ना नहीं) और फिर ट्रिगरिंग कथन के लिए। वैकल्पिक रूप से, पंक्ति ट्रिगर से पहले, डेटा ब्लॉक को ट्रिगरिंग कथन और ट्रिगर दोनों के लिए केवल एक बार पढ़ा जाना चाहिए। – Ollie

1

हां, here आपके पास update भाग का एक उदाहरण है।

आपको बस insert भाग में ऐसा करने की आवश्यकता है।

2

मैं डीएमएल समय पर फ़ाइल सिस्टम को लिखने से बचूंगा, लेकिन हर रात बैच प्रक्रिया में डेटा खींच लेगा (या जो भी आवृत्ति)।

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

create table test 
(
id number, 
val varchar2(100), 
modified_date date default sysdate not null 
) 
; 

CREATE OR REPLACE TRIGGER TR_TEST_BU 
BEFORE UPDATE 
ON TEST REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 
begin 
    :new.modified_date := sysdate; 
end; 

insert into test(id, val) values (1, 'Insert 1'); 
commit; 

select * from test; 

exec dbms_lock.sleep(5); 
update test set val = 'Update 1' where id = 1; 
commit; 

select * from test; 

आप अद्यतन करने से पहले पुराने डेटा की जरूरत है (या आप हटाए गए डेटा के बारे में परवाह) है, तो आप ट्रिगर, एक इतिहास मेज पर पुरानी या हटाई गई मूल्यों लिखने के लिए फिर वहाँ से डेटा निकालने के संशोधित करेंगे।

यह भी ध्यान रखें कि तालिका में ट्रिगर जोड़ने से संबंधित डीएमएल गतिविधि धीमी हो जाएगी। कुछ दुकानें व्यापार तर्क नियमों ("सभी ऐप्स को संशोधित modifed_date" edict) के साथ ट्रिगर्स को प्रतिस्थापित करके इसे टालना चाहते हैं, जो आमतौर पर मैंने जो देखा है उससे असंगत डेटा (या बदतर) की ओर जाता है।

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