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 undinformation_schema
Schemas und Toast-Tabellen aus Ihrerselect
. - 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 vontab_name
.