Auslöser: Verschiebt gelöschte Zeilen in die Archivtabelle


18

Ich habe eine kleine Tabelle (~ 10 Zeilen) restrictionsin meiner PostgreSQL-Datenbank, in der täglich Werte gelöscht und eingefügt werden.

Ich hätte gerne eine Tabelle restrictions_deleted, in der jede Zeile, aus der gelöscht restrictionswird, automatisch gespeichert wird. Da restrictionses eine Seriennummer gibt, gibt es keine Duplikate.

Wie schreibe ich einen solchen Trigger in PostgreSQL?

Antworten:


15

Sie müssen nur die alten Daten in die restrictions_deletedTabelle verschieben, bevor sie gelöscht werden. Dies erfolgt mit dem OLDDatentyp. Sie können eine regulat- INSERTAnweisung verwenden und die OLDWerte als einzufügende Werte verwenden.

CREATE TRIGGER moveDeleted
BEFORE DELETE ON restrictions 
FOR EACH ROW
EXECUTE PROCEDURE moveDeleted();


CREATE FUNCTION moveDeleted() RETURNS trigger AS $$
    BEGIN
       INSERT INTO restrictions_deleted VALUES(OLD.column1, OLD.column2,...);
       RETURN OLD;
    END;
$$ LANGUAGE plpgsql;

2
Sie können die explizite Liste der Spaltenwerte durch etwas wieVALUES((OLD).*)
KayEss

1
Funktioniert gut, muss aber create functionvorher aufgerufen werden create trigger. Und der VALUES((OLD).*)von KayEss vorgeschlagene Trick ist nett.
Mivk

8

Wenn Sie offen für einen anderen Ansatz sind, haben Sie in Betracht gezogen, der Tabelle stattdessen ein Boolesches Flag "gelöscht" oder einen Zeitstempel "gelöscht_at" hinzuzufügen.

Oder noch besser, verweigern Sie CRUD den Zugriff auf Ihre Datenbanktabellen und verwalten Sie den Audit-Trail in Ihrer Transaktions-API :)


+1 Danke - würde in meinem Fall nicht funktionieren, aber es ist ein netter Ansatz, der nur eine einzige Tabelle verwendet.
Adam Matan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.