2016-04-29 6 views
1

Ich habe 54 Tabellen in meiner Postgresql-Datenbank. Und die meisten Tabellen enthalten das Erstellungsdatum der Daten. Ich möchte einen globalen Trigger für alle Tabellen erstellen, die CreatedDate Spalte enthalten. Und dieser Trigger wird die Spalte aktualisieren, wenn ein Datensatz eingefügt wird.Postgresql-Trigger für alle Tabellen, die das Erstellungsdatum enthalten

+0

Warum 'Sie nicht einfach die Spalten nun auf' default() ändern? –

+0

Standard jetzt() funktioniert gut für SQL-Abfragen einfügen. Aber ich benutze Software von Drittanbietern wie QGIS, um Datensätze in den Tisch zu legen. In dieser Übung wird ein neuer Datensatz manuell über Formulare erstellt. Wenn ich das Erstellungsdatum manuell ablege, geht das Datumsfeld NULL zur Datenbanktabelle. – barteloma

+0

Ok. Warum versuchst du nicht auf gis.stackexchange.com zu fragen? Es muss definitiv eine Lösung dafür geben. Ich bezweifle, dass qgis Standardeinstellungen auf Einfügungen nicht behandeln kann. –

Antwort

3

Jede Tabelle benötigt einen eigenen Auslöser, aber Sie können einen einzigen Trigger-Funktion verwenden:

CREATE FUNCTION set_created_date() RETURNS trigger AS $$ 
BEGIN 
    NEW.createddate := CURRENT_TIME; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

Für jede Tabelle Sie einen Trigger wie diese haben sollte:

CREATE TRIGGER set_createddate 
BEFORE INSERT ON <table name> 
FOR EACH ROW EXECUTE PROCEDURE set_created_date(); 

Sie den Auslöser einstellen für alle 54 Tabellen mit diesem Code (zuerst erstellen Sie die Trigger-Funktion):

DO $$ 
DECLARE 
    t record; 
BEGIN 
    FOR t IN 
     SELECT * FROM information_schema.columns 
     WHERE column_name = 'createddate' 
    LOOP 
     EXECUTE format('CREATE TRIGGER set_createddate 
         BEFORE INSERT ON %I.%I 
         FOR EACH ROW EXECUTE PROCEDURE set_created_date()', 
         t.schema_name, t.table_name); 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 

Diese obvio Normalerweise wird davon ausgegangen, dass keine anderen Tabellen mit einer Spalte mit dem Namen createddate vorhanden sind. Dies können Sie leicht überprüfen, indem Sie die Tabelle information_schema.columns abfragen.

0

Für diejenigen, die Probleme mit Patricks Lösung haben. Hier der gleiche Code mit einer gewissen Verbesserung:

DO $$ 
DECLARE 
    t text; 
BEGIN 
    FOR t IN 
     SELECT table_name FROM information_schema.columns 
     WHERE column_name = 'createddate' 
    LOOP 
     EXECUTE format('CREATE TRIGGER set_createddate 
         BEFORE INSERT ON %I 
         FOR EACH ROW EXECUTE PROCEDURE set_created_date()', 
         t); 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 
+0

Im Allgemeinen sind Antworten viel hilfreicher, wenn sie eine Erklärung enthalten, was der Code tun soll, und warum das das Problem löst, ohne andere einzuführen. – Peter

Verwandte Themen