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.