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?

Adam Matan
la source

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;
DrColossos
la source
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 :)

Jack Douglas
la source
+1 Merci - ne fonctionnerait pas pour mon cas, mais c'est une bonne approche qui utilise une seule table.
Adam Matan