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?

1voto

Tometzky Punkte 20675

Am einfachsten wird es sein pg_dump -s Objektdefinitionen und filtern sie nach Zeilen, die mit CREATE TRIGGER .

Etwas wie

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

(in bash) sollte funktionieren (überprüfen Sie es und führen Sie es dann in der Datenbank aus).

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

1voto

gargii Punkte 830

Ich habe zwei Verbesserungen an der Lösung aus den älteren Antworten vorgenommen:

  • Filterung nach Triggername, Tabelle und Schema hinzugefügt
  • ordnungsgemäße Handhabung von "Truncate"-Auslösern (von der ursprünglichen Lösung ignoriert)

CREATE OR REPLACE FUNCTION strip_all_triggers() RETURNS text AS $$ DECLARE
    triggRecord RECORD;
BEGIN
    create temp table all_triggers on commit drop as (
        SELECT tgname AS trigger_name, n.nspname as trigger_schema,  relname as trigger_table
        FROM pg_trigger
                 JOIN pg_class ON pg_class.oid = tgrelid
                 JOIN pg_namespace n ON n.oid = pg_class.relnamespace);

    FOR triggRecord IN select distinct on (trigger_schema, trigger_table, trigger_name) trigger_schema, trigger_table, trigger_name from all_triggers
                       where trigger_schema like 'public' and trigger_name like '%' -- MY FILTER
        LOOP
            RAISE NOTICE 'Dropping trigger: % on table: %.%', triggRecord.trigger_name, triggRecord.trigger_schema, triggRecord.trigger_table;
            EXECUTE 'DROP TRIGGER ' || triggRecord.trigger_name || ' ON ' || triggRecord.trigger_schema || '.' || triggRecord.trigger_table || ';';
        END LOOP;

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

select strip_all_triggers();

0voto

pcent Punkte 1849

Sie können mit dieser Abfrage beginnen, um Auslösernamen zu finden:

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

0voto

Jitendra Loyal Punkte 1

Die oberste Antwort ist immer noch fehlerhaft, weil es keine Notwendigkeit für zwei Schleifen gibt.

Dies kann folgendermaßen geschehen:

CREATE PROCEDURE _DropTableTriggers()
AS
$$
DECLARE
    _rec    RECORD;
BEGIN
    FOR _rec IN
        SELECT  DISTINCT    event_object_table, trigger_name
        FROM    INFORMATION_SCHEMA.triggers
    LOOP
        EXECUTE 'DROP TRIGGER ' || _rec.trigger_name || ' ON ' || _rec.event_object_table || ';';
    END LOOP;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

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