2015-10-16 11 views
6

मैं डेटाबेस माइग्रेशन की शुद्धता को सत्यापित करना चाहता हूं जो कुछ तालिकाओं में ट्रिगर्स जोड़ता है। मैं sqitch का उपयोग कर रहा हूं, इसलिए मैं इसे SQL क्वेरी के साथ जांचने का एक तरीका ढूंढना चाहता हूं। मेरा मानना ​​है कि पोस्टग्रेस सिस्टम टेबल के साथ यह संभव होना चाहिए, लेकिन मुझे वर्तमान में ऐसा करने का कोई तरीका नहीं मिल रहा है।पोस्टग्रेएसक्यूएल में ट्रिगर मौजूद है या नहीं?

उत्तर

11

कैटलॉग pg_trigger का उपयोग करें।

एक मेज books के लिए एक सरल देखने:

select tgname 
from pg_trigger 
where not tgisinternal 
and tgrelid = 'books'::regclass; 

    tgname  
--------------- 
books_trigger 
(1 row) 

pg_proc का उपयोग करते हुए ट्रिगर समारोह का स्रोत प्राप्त करने के लिए:

select pg_get_triggerdef(t.oid) as "trigger declaration" 
from pg_trigger t 
where not tgisinternal 
and tgrelid = 'books'::regclass; 

              trigger declaration     
-------------------------------------------------------------------------------------------------------------- 
CREATE TRIGGER books_trigger BEFORE INSERT OR UPDATE ON books FOR EACH ROW EXECUTE PROCEDURE books_trigger() 
(1 row) 
+0

:

select tgname, proname, prosrc from pg_trigger join pg_proc p on p.oid = tgfoid where not tgisinternal and tgrelid = 'books'::regclass; tgname | proname | prosrc ---------------+---------------+------------------------------------------------ books_trigger | books_trigger | + | | begin + | | if tg_op = 'UPDATE' then + | | if new.listorder > old.listorder then + | | update books + | | set listorder = listorder- 1 + | | where listorder <= new.listorder + | | and listorder > old.listorder + | | and id <> new.id; + | | else + | | update books + | | set listorder = listorder+ 1 + | | where listorder >= new.listorder + | | and listorder < old.listorder + | | and id <> new.id; + | | end if; + | | else + | | update books + | | set listorder = listorder+ 1 + | | where listorder >= new.listorder + | | and id <> new.id; + | | end if; + | | return new; + | | end (1 row) 

pg_get_triggerdef() समारोह उपयोग के उदाहरण मैंने वास्तव में यह कोशिश की है और काफी उलझन में था। अजीब चीज है: मुझे 7 'tgname' की तरह इस 'RI_ConstraintTrigger_c_195564' की तरह दिख रहा है। मैं postgresql 9.4 का उपयोग कर रहा हूं। – dredozubov

+1

वे आंतरिक बाधा ट्रिगर्स हैं। संपादित उत्तर में, उन्हें छोड़ने के लिए 'tgisinternal'' का उपयोग करें। – klin

+0

धन्यवाद! यह मदद करता है! – dredozubov

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