Trigger: sposta le righe eliminate nella tabella di archiviazione


18

Ho una piccola tabella (~ 10 righe) chiamata restrictionsnel mio database PostgreSQL, in cui i valori vengono eliminati e inseriti su base giornaliera.

Vorrei avere una tabella chiamata restrictions_deleted, in cui ogni riga eliminata restrictionsverrà memorizzata automaticamente. Poiché restrictionsha un ID seriale, non ci saranno duplicati.

Come scrivo un tale trigger in PostgreSQL?

Risposte:


16

Devi solo spostare i vecchi dati nella restrictions_deletedtabella prima che vengano eliminati. Questo viene fatto con il OLDtipo di dati. È possibile utilizzare INSERTun'istruzione regulat e utilizzare i OLDvalori come valori da inserire.

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
Puoi sostituire l'elenco esplicito dei valori di colonna con qualcosa del tipoVALUES((OLD).*)
KayEss

1
Funziona bene, ma è create functionnecessario chiamare prima create trigger. E il VALUES((OLD).*)trucco suggerito da KayEss è carino.
marzo

8

Se sei aperto a un approccio diverso, hai preso in considerazione l'aggiunta di un flag booleano "eliminato" alla tabella o un timestamp "delete_at".

O meglio, negare l'accesso CRUD alle tabelle del database e gestire la traccia di controllo nell'API transazionale :)


+1 Grazie - non funzionerebbe per il mio caso, ma è un approccio gradevole che utilizza solo una tabella.
Adam Matan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.