Déclencheur: déplacer les lignes supprimées vers la table d'archivage


18

J'ai une petite table (~ 10 lignes) appelée restrictionsdans ma base de données PostgreSQL, où les valeurs sont supprimées et insérées quotidiennement.

Je voudrais avoir un tableau appelé restrictions_deleted, où chaque ligne supprimée restrictionssera stockée automatiquement. Puisqu'il restrictionsa un identifiant de série, il n'y aura pas de doublons.

Comment écrire un tel déclencheur dans PostgreSQL?

Réponses:


16

Vous avez juste besoin de déplacer les anciennes données dans la restrictions_deletedtable avant de les supprimer. Cela se fait avec le OLDtype de données. Vous pouvez utiliser une INSERTinstruction regulat et et utiliser les OLDvaleurs comme valeurs à insérer.

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
Vous pouvez remplacer la liste explicite des valeurs de colonne par quelque chose commeVALUES((OLD).*)
KayEss

1
Fonctionne bien, mais les create functionbesoins doivent être appelés avant create trigger. Et l' VALUES((OLD).*)astuce suggérée par KayEss est sympa.
mivk

8

Si vous êtes ouvert à une approche différente, avez-vous envisagé d'ajouter un indicateur booléen «supprimé» à la table ou un horodatage «supprimé_à la place».

Ou mieux encore, refusez l'accès CRUD à vos tables de base de données et gérez la piste d'audit dans votre API transactionnelle :)


+1 Merci - ne fonctionnerait pas pour mon cas, mais c'est une bonne approche qui utilise une seule table.
Adam Matan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.