2016-12-29 2 views
0

Ich habe eine SQL-Einfügung, die die version Spalte erhöhen und die time Spalte auf einen Primärschlüsselkonflikt aktualisieren sollte.Postgres Trigger interferieren mit 'bei Konflikt tun Update-Set'

insert into items (pk, time, version, name) 
     values (9999, now(), 1) 
     on conflict (pk) do update set 
      time = now(), 
      version = items.version + 1, 
      name = excluded.name 

Alles funktioniert gut, bis ich einen Trigger hinzufügen, um Zeilen zu archivieren, wenn ein Update passiert. Wenn also eine Zeile mit Version 1 vorhanden ist und eine Einfügung später erfolgt, erhöht die obige Abfrage die Spalte version auf 2. Aber ich möchte, dass die alte Zeile mit Version 1 in die Tabelle archive geht.

Aber wenn ich den Trigger unten hinzufüge, aktualisiert die obige Einfügung nicht die Versions- und Zeitspalten, wie es ohne diesen Auslöser tat. Wie kann ich den Auslöser reparieren? Ist es, weil ich einen return old mache, oder weil es ein before update Trigger ist?

CREATE FUNCTION archivefunction() RETURNS trigger 
    LANGUAGE plpgsql 
AS $$ 
begin 
    insert into archive (pk, time, version, name) 
    values (old.pk, old.time, old.version, old.name); 
    return old; 
    end 
$$ 

CREATE TRIGGER archivetrigger 
BEFORE UPDATE ON items 
FOR EACH ROW EXECUTE PROCEDURE archivefunction() 

Antwort

1

Ja, für die return old ist, was hält die Rückkehr alt ist der Rekordwert ändert sich mit den alten Werten aktualisiert werden, könnten Sie eine return new; Aussage ohnehin tun, was Sie wollen, und ich werde es tun, in Nach dem Update-Trigger ist die Logik, die archiviert werden soll, nachdem die Listenversion aktualisiert wurde, nicht zu archivieren, bevor sie aktualisiert wird

Verwandte Themen