2010-06-22 13 views
8

Gibt es eine Möglichkeit, ALLE Auslöser von ALLEN Tabellen in Postgres zu löschen? Ich weiß, dass es eine pg_trigger-Tabelle gibt, die ich mir ansehen kann, aber es sieht nicht so aus, als ob sie genügend Informationen enthält, um zu entziffern, welche Trigger ich meinen Tabellen hinzugefügt habe.Drop ALLE Trigger von Postgres DB?

Es sieht auch aus wie Fremdschlüssel Einschränkungen in der Tabelle Pg_trigger angezeigt werden, die ich nicht löschen möchte. Ich möchte nur den vom Benutzer erstellten Trigger aus meinen Tabellen löschen und die FKs behalten.

Irgendwelche Vorschläge?

Antwort

19

Danke, James.

Die Funktion von Drop ALL triggers from Postgres DB? entfernt nur das Vorkommen aus der ersten Tabelle und hinterlässt die gleichnamigen Trigger in anderen Tabellen. Hier ist die feste Funktion:

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

Danke für den Fang! – JamesD

+1

Dies ist das zweite Mal, dass diese Antwort mir helfen, ich würde wieder +1 wenn ich könnte –

+0

'information_schema' fehlt TRUNCATE Trigger, so verwenden Sie etwas wie folgt:' SELECT tgname AS trigger_name, relname AS event_object_table VON pg_trigger INNER JOIN pg_class ON pg_class .oid = tgrelid' – Lloeki

1

einen Blick in den information_schema Nehmen:

SELECT * FROM information_schema.triggers; 
+0

SELECT trigger_name VON INFORMATION_SCHEMA.TRIGGERS; funktioniert besser. – Evgeny

0

Sie aus dieser Abfrage starten können, outr Triggernamen zu finden:

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

Am einfachsten zu pg_dump -s Objektdefinitionen sein wird und es für die Linien filtern beginnend mit CREATE TRIGGER.

So etwas wie

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

(in bash) funktionieren soll (es überprüft und dann in der Datenbank ausgeführt werden).

Aber vielleicht sollten Sie stattdessen alter table table_name disable trigger trigger_name betrachten.

2

UPDATE: Sehen Sie die echte Lösung für die volle Funktion, die Sie wollen.

Okay, kam ich mit einer Funktion auf, die das für mich tut:

 
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(); 

dass jeder Trigger in Ihrem öffentlichen Schema fallen wird.

2

Einfach Kaskade Drop die Sprache, in der Sie die Trigger erstellt.
Zum Beispiel habe ich erstellen Trigger in plpgsql, so dass die folgende Abfrage löscht alle sofort auslöst -

DROP LANGUAGE plpgsql CASCADE; 
0

Ich ziehe diese (basierend auf that) über die akzeptierte Antwort von @ kuznetso3v, weil es mir die Möglichkeit gibt, zu inspizieren die DROP STATEMENT s vor ihnen mit copy-Paste Ausführung:

SELECT 'DROP TRIGGER ' || trigger_name || ' ON ' || event_object_table || ';' 
FROM information_schema.triggers 
WHERE trigger_schema = 'public';