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()