Nun gibt es keine Datenbank weite Trigger Schöpfung, sondern für alle derartigen Masse-admin-Operationen könnten Sie PostgreSQL-Systemtabellen verwenden, um Abfragen für Sie zu erzeugen, anstatt sie von Hand zu schreiben. In diesem Fall könnten Sie laufen:
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;
Dies wird Ihnen von Strings gesetzt bekommen, die SQL-Befehle sind 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 nur auf einmal ausführen (entweder durch psql
oder pgAdmin) .
Jetzt eine Erklärung:
- ich wählen Namen von Tabellen in meiner Datenbank
information_schema.tables
Systemtabelle verwenden. Da es Daten von buchstäblich allen Tabellen gibt, vergessen Sie nicht, pg_catalog
und information_schema
Schemas und Toast-Tabellen von Ihrem select
auszuschließen.
- Ich benutze
quote_ident(text)
Funktion, die String in doppelte Anführungszeichen setzen (""
), falls erforderlich (dh. Namen mit Leerzeichen oder Großbuchstaben erfordern, dass).
- Wenn ich eine Liste von Tabellennamen habe, verkette ich sie einfach mit einigen statischen Strings, um meine SQL-Befehle zu bekommen.
- Ich schreibe diesen Befehl mit 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
setzen.
Nein, Datenbank-weite Trigger werden nicht unterstützt. Warum möchtest du dieses besondere Ding trotzdem machen? –
Ich muss Datenbankaktionen aufzeichnen, um sie mit dem Smartphone zu synchronisieren. Dann führe ich diese Auslösetabelle nach Tabelle aus. Danke für die Hilfe. –
@EduardoRafaelCorreadeSouza Ich weiß, dass ein paar Tage vergangen sind, seit du diese Frage gestellt hast und wahrscheinlich hast du es von Hand gemacht. Aber schau dir meine Antwort an. Wenn es dich dazu gebracht hat, etwas Nützliches zu lernen, das dir in der Zukunft bei ähnlichen Aufgaben helfen kann, wäre es nett von dir, darüber nachzudenken, meine Antwort zu akzeptieren. –