2015-04-16 7 views
8

Ich habe einen Auslöser, aber ich muss mit allen Tabellen der Postgre. Gibt es einen solchen Befehl?Wie Trigger für alle Tabellen in Postgresql erstellen?

CREATE TRIGGER delete_data_alldb 
BEFORE DELETE 
ON ALL DATABASE 
FOR EACH ROW 
EXECUTE PROCEDURE delete_data(); 
+0

Nein, Datenbank-weite Trigger werden nicht unterstützt. Warum möchtest du dieses besondere Ding trotzdem machen? –

+0

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. –

+0

@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. –

Antwort

8

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.
+1

Ich habe 'Unterabfrage in FROM muss einen Alias ​​haben ', so hinzugefügt') AS inner_select; 'bis zum Ende und es hat funktioniert. –

+0

@IanVaughan danke, du bist 100% richtig! Ich habe meine Antwort korrigiert. –

Verwandte Themen