20 Stimmen

ALLE Auslöser aus der Postgres-DB löschen?

Gibt es eine Möglichkeit, ALLE Trigger aus ALLEN Tabellen in Postgres zu löschen? Ich weiß, dass es eine pg_trigger-Tabelle gibt, die ich mir ansehen könnte, 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.

Es sieht auch so aus, als ob Foreign Key Constraints in der Tabelle pg_trigger auftauchen, 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?

33voto

smith3v Punkte 416

Danke, James.

Die Funktion von ALLE Auslöser aus der Postgres-DB löschen? entfernt nur das Vorkommen aus der ersten Tabelle und lässt die Auslöser mit demselben Namen 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();

8voto

Drux Punkte 11202

Ich bevorzuge dies (basierend auf que ) gegenüber der akzeptierten Antwort von @kuznetso3v, weil ich dadurch die Möglichkeit habe, die DROP STATEMENT s, bevor sie durch Kopieren und Einfügen ausgeführt werden:

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

3voto

Frank Heikens Punkte 105033

Werfen Sie einen Blick in das information_schema:

SELECT * FROM information_schema.triggers;

2voto

JamesD Punkte 601

UPDATE: Sehen Sie sich die echte Lösung an, um die gewünschte Funktion zu erhalten.

Also gut, ich habe eine Funktion entwickelt, die das für mich erledigt:

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

Dadurch wird jeder Trigger in Ihrem öffentlichen Schema gelöscht.

2voto

Pushpak Dagade Punkte 5946

Lassen Sie einfach die Sprache fallen, in der Sie die Auslöser erstellt haben.
Ich erstelle zum Beispiel Auslöser in plpgsql so dass die folgende Abfrage alle Auslöser sofort löscht -

DROP LANGUAGE plpgsql CASCADE;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X