PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie erstelle ich einen Trigger für alle Tabellen in Postgresql?

Nun, es gibt keine datenbankweite Trigger-Erstellung, aber für all diese Massen-Admin-Operationen könnten Sie PostgreSQL-Systemtabellen verwenden, um Abfragen für Sie zu generieren, anstatt sie von Hand zu schreiben. In diesem Fall könnten Sie Folgendes ausführen:

SELECT
    'CREATE TRIGGER '
    || tab_name
    || ' BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();' AS trigger_creation_query
FROM (
    SELECT
        quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name
    FROM
        information_schema.tables
    WHERE
        table_schema NOT IN ('pg_catalog', 'information_schema')
        AND table_schema NOT LIKE 'pg_toast%'
) tablist;

Dadurch erhalten Sie eine Reihe von Zeichenfolgen, bei denen es sich um SQL-Befehle handelt, wie:

CREATE TRIGGER schema1.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table2 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table3 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2."TABLE2" BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
...
etc

Sie müssen sie nur sofort ausführen (entweder mit psql oder pgAdmin).

Nun eine Erklärung:

  • Ich wähle Namen von Tabellen in meiner Datenbank mit information_schema.tables aus Systemtisch. Da es Daten von buchstäblich allen Tabellen gibt, denken Sie daran, pg_catalog auszuschließen und information_schema Schemas und Toast-Tabellen aus Ihrer select .
  • Ich verwende quote_ident(text) Funktion, die den String in doppelte Anführungszeichen setzt ("" ) falls erforderlich (dh Namen mit Leerzeichen oder Großbuchstaben erfordern dies).
  • Wenn ich eine Liste mit Tabellennamen habe, verkette ich sie einfach mit einigen statischen Zeichenfolgen, um meine SQL-Befehle zu erhalten.
  • Ich schreibe diesen Befehl mit einer Unterabfrage, weil ich möchte, dass Sie eine bessere Vorstellung davon bekommen, was hier vor sich geht. Sie können eine einzelne Abfrage schreiben, indem Sie quote_ident(table_schema) || '.' || quote_ident(table_name) anstelle von tab_name .