2010-06-22 12 views
8

क्या पोस्टग्रेज़ में सभी तालिकाओं से सभी ट्रिगर्स ड्रॉप करने का कोई तरीका है? मुझे पता है कि एक pg_trigger तालिका है जिसे मैं देख सकता था, लेकिन ऐसा लगता है कि इसमें मेरे लिए पर्याप्त जानकारी नहीं है, यह समझने के लिए कि मेरे टेबल में कौन से ट्रिगर्स जोड़े गए हैं।पोस्टग्रेर्स डीबी से सभी ट्रिगर्स ड्रॉप करें?

ऐसा लगता है कि पीजी_ट्रिगर तालिका में विदेशी कुंजी बाधाएं दिखाई देती हैं, जिन्हें मैं छोड़ना नहीं चाहता हूं। मैं बस अपनी टेबल से उपयोगकर्ता बनाया ट्रिगर ड्रॉप करना चाहता हूं और एफके रखता हूं।

कोई सुझाव?

उत्तर

19

धन्यवाद, जेम्स।

Drop ALL triggers from Postgres DB? से फ़ंक्शन केवल पहली तालिका से होने वाली घटना को स्ट्रिप्स करता है और ट्रिगर को अन्य तालिकाओं में उसी नाम से छोड़ देता है। यहां निश्चित फ़ंक्शन है:

CREATE OR REPLACE FUNCTION strip_all_triggers() RETURNS text AS $$ DECLARE 
    triggNameRecord RECORD; 
    triggTableRecord RECORD; 
BEGIN 
    FOR triggNameRecord IN select distinct(trigger_name) from information_schema.triggers where trigger_schema = 'public' LOOP 
     FOR triggTableRecord IN SELECT distinct(event_object_table) from information_schema.triggers where trigger_name = triggNameRecord.trigger_name LOOP 
      RAISE NOTICE 'Dropping trigger: % on table: %', triggNameRecord.trigger_name, triggTableRecord.event_object_table; 
      EXECUTE 'DROP TRIGGER ' || triggNameRecord.trigger_name || ' ON ' || triggTableRecord.event_object_table || ';'; 
     END LOOP; 
    END LOOP; 

    RETURN 'done'; 
END; 
$$ LANGUAGE plpgsql SECURITY DEFINER; 

select strip_all_triggers(); 
+0

इसे पकड़ने के लिए धन्यवाद! – JamesD

+1

यह दूसरी बार है जब यह जवाब मेरी मदद करता है, अगर मैं –

+0

'info_schema' ट्रंकेट ट्रिगर्स को याद कर रहा हूं, तो मैं फिर से +1 करूंगा, इसलिए इस तरह कुछ उपयोग करें: 'ट्रिगनाम एएस ट्रिगर_नाम, relname AS event_object_table से pg_trigger INNER जॉइन pg_class पर pg_class पर .oid = tgrelid' – Lloeki

1

INFORMATION_SCHEMA में एक नज़र डालें:

SELECT * FROM information_schema.triggers; 
+0

information_schema.triggers से चयन TRIGGER_NAME; बेहतर काम करता है। – Evgeny

0

आपने इस क्वेरी से शुरू कर सकता है, outr ट्रिगर नाम खोजने के लिए:

select * from pg_trigger t,pg_proc where 
pg_proc.oid=t.tgfoid 
1

सबसे आसान pg_dump -s वस्तु परिभाषाओं को हो सकता है और लाइनों के लिए यह फिल्टर करेगा CREATE TRIGGER से शुरू हो रहा है।

तरह

./pg_dump -s db_name | grep '^CREATE TRIGGER' | \ 
    while read _ _ triggername _; do \ 
    echo drop trigger "$triggername;"; \ 
    done 

(बैश में) कुछ (उसकी समीक्षा करेंगे और उसके बाद डेटाबेस में चलाने) काम करना चाहिए।

लेकिन शायद आपको alter table table_name disable trigger trigger_name पर विचार करना चाहिए।

2

अद्यतन: पूर्ण कार्य के लिए वास्तविक समाधान देखें।

ठीक है, मैं एक समारोह है कि मेरे लिए यह करता है के साथ आया था:

 
CREATE OR REPLACE FUNCTION strip_all_triggers() RETURNS text AS $$ DECLARE 
     triggNameRecord RECORD; 
    triggTableRecord RECORD; 
BEGIN 
    FOR triggNameRecord IN select distinct(trigger_name) from information_schema.triggers where trigger_schema = 'public' LOOP 
     SELECT distinct(event_object_table) INTO triggTableRecord from information_schema.triggers where trigger_name = triggNameRecord.trigger_name; 
     RAISE NOTICE 'Dropping trigger: % on table: %', triggNameRecord.trigger_name, triggTableRecord.event_object_table; 
     EXECUTE 'DROP TRIGGER ' || triggNameRecord.trigger_name || ' ON ' || triggTableRecord.event_object_table || ';'; 
    END LOOP; 

    RETURN 'done'; 
END; 
$$ LANGUAGE plpgsql SECURITY DEFINER; 

select strip_all_triggers(); 

कि आपके सार्वजनिक स्कीमा में कोई ट्रिगर छोड़ देंगे।

2

बस उस भाषा को छोड़ दें जिसमें आपने ट्रिगर्स बनाए हैं।
उदाहरण के लिए, मैं plpgsql में ट्रिगर बना है, तो निम्न क्वेरी सभी तत्क्षण चलाता है हटाता है -

DROP LANGUAGE plpgsql CASCADE; 
0

मैं @ kuznetso3v द्वारा स्वीकार कर लिया जवाब में इस (पर that आधार पर) पसंद करते हैं क्योंकि यह मुझे निरीक्षण करने के लिए एक मौका देता DROP STATEMENT रों उन्हें कॉपी-पेस्ट के साथ निष्पादित करने से पहले:

SELECT 'DROP TRIGGER ' || trigger_name || ' ON ' || event_object_table || ';' 
FROM information_schema.triggers 
WHERE trigger_schema = 'public'; 
संबंधित मुद्दे