2014-05-06 10 views
14

टैग पर एक pgsql ईवेंट ट्रिगर में वैकल्पिक तालिका, मैं जानना चाहता हूं कि कौन सी तालिका बदल दी जा रही है।पोस्टग्रेस इवेंट ट्रिगर से SQL टेक्स्ट कैसे प्राप्त करें

पीजी वैरिएबल इसमें शामिल नहीं होते हैं, न ही स्टैक्ड डायग्नोस्टिक द्वारा प्राप्त किए गए चर को करते हैं।

उपलब्ध चर के साथ, ट्रिगर फ़ंक्शन के भीतर फ़ंक्शन शुरू करने के लिए जिम्मेदार SQL कमांड के पाठ को देखने के लिए कोई तरीका है।

उदाहरण के लिए

, अगर

ALTER TABLE base1 ADD COLUMN col1 int; 

घटना ट्रिगर फोन करने के लिए जिम्मेदार थे, वहाँ घटना ट्रिगर के भीतर किसी भी तरह से तो ALTER TABLE base1 ADD COLUMN col1 int पाठ में ही देखने के लिए है?

+6

'चयन current_query()'। लेकिन यह केवल * शीर्ष स्तर * क्वेरी दिखाएगा, जो आवश्यक नहीं है कि ईवेंट ट्रिगर को किसने निकाल दिया - कहें, अगर आपने पीएल/पीजीएसक्यूएल फ़ंक्शन के साथ 'वैकल्पिक तालिका' की है। आदेश ट्रिगर को कमांड के बारे में अधिक जानकारी जोड़ने के लिए बढ़ाया जाएगा, लेकिन वर्तमान में 9.3/9.4 में बहुत सीमित है। –

+0

@ क्रेग्रिंजर - धन्यवाद। विस्तार के लिए तत्पर हैं! –

+2

यदि आप सी में एक ईवेंट ट्रिगर लिखते हैं, तो आपके पास कमांड का पार्स पेड़ भी है। http://www.postgresql.org/docs/9.3/static/event-trigger-interface.html निश्चित रूप से उस पर भरोसा करने का सबसे अच्छा तरीका नहीं है, लेकिन यह सुविधा तब तक बढ़ी है जब तक यह सुविधा विस्तारित न हो जाए। – pozs

उत्तर

15

पोस्टग्रेएसक्यूएल 9.5 से शुरू, फ़ंक्शन pg_event_trigger_ddl_commands()ddl_command_end ईवेंट ट्रिगर्स के लिए उपलब्ध है। TAG फ़िल्टर का उपयोग करके, इसका उपयोग किसी भी ALTERED तालिका को प्रोसेस करने के लिए किया जा सकता है। object_identity (या objid) का उपयोग यह जानने की मूल समस्या को हल करने के लिए किया जा सकता है कि कौन सी तालिका को बदल दिया गया है। पूर्ण आदेश प्राप्त करने के लिए, यह भी उपलब्ध है, लेकिन यह आंतरिक प्रकार pg_ddl_command है।

CREATE TABLE t (n INT); 

CREATE FUNCTION notice_event() RETURNS event_trigger AS $$ 
DECLARE r RECORD; 
BEGIN 
    FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP 
     RAISE NOTICE 'caught % event on %', r.command_tag, r.object_identity; 
    END LOOP; 
END; 
$$ 
LANGUAGE plpgsql; 

CREATE EVENT TRIGGER tr_notice_alter_table 
    ON ddl_command_end WHEN TAG IN ('ALTER TABLE') 
    EXECUTE PROCEDURE notice_event(); 

ALTER TABLE t ADD c CHAR; 

आउटपुट: NOTICE: caught ALTER TABLE event on public.t

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