Comment faire pour PostgreSQL insérer une ligne dans une table lors de la suppression d'une autre table?
Nous avons une application, qui permet de supprimer une ligne d'une table basée sur les demandes des utilisateurs. Je ne peux pas modifier le code de l'application. Cependant, je veux insérer une ligne dans une autre table (un peu comme un journal de journal) avec des informations à partir de quelques autres tables basées sur des informations de la ligne qui est supprimée.
Comment puis-je atteindre ce niveau dans PostgreSQL?
source d'informationauteur Benson Jin
Vous devez vous connecter pour publier un commentaire.
Écrire une fonction de déclenchement. Quelque chose comme ceci:
Et un déclencheur
ON DELETE
. Comme ceci:Éléments clés
Mieux faire un déclencheur
SUPPRIMER
etPOUR CHAQUE LIGNE
.Pour retourner toutes les colonnes de la table ancienne utiliser la syntaxe
(OLD).*
. Voir le manuel à propos de l'accès composite types. SinonOLD.*
est une erreur de syntaxe, aussi, parce queOLD
est ajouté à laFROM
clause implicitement. Pour unVALUES
expression, il faudrait(OLD).*
cependant. Comme:Vous pouvez inclure des valeurs de n'importe quelle autre table, comme je viens de le démontrer. Assurez-vous juste pour obtenir une seule ligne, ou vous créer plusieurs entrées.
Que le déclencheur est activé
AFTER
cas, la fonction peutRETURN NULL
.Sur la visibilité
En réponse à @couling attentifs de commentaire.
Alors que les clés étrangères peuvent être a déclaré que
DIFFÉRÉS
cela ne fera que reporter le contrôle d'intégrité, non la suppression elle-même. Les lignes qui sont supprimés dans les déclencheurs exécuté avant celui-ci, ou parON DELETE CASCADE
étrangers, les touches de pas être plus visibles au moment de ceAFTER DELETE
du déclencheur. (Tout se passe dans une transaction évidemment. Aucun de ces détails de l'affaire pour d'autres transactions, qui verra tous ou aucun des effets. Reportez-vous au manuel pour plus d'informations sur le MVCC modèle et l'isolation de la transaction.)Par conséquent, si vous souhaitez inclure les valeurs de lignes en fonction de telle manière dans votre
INSERT
assurez-vous d'appeler ce déclencheur avant ces lignes sont supprimés.Vous pourriez avoir à vous pour faire de ce déclencheur
BEFORE DELETE
.Ou cela peut signifier que vous avez à l'ordre de votre déclenche en conséquence,
BEFORE
déclenche venir avantAFTER
déclencheurs, évidemment. Et déclenche au même niveau, sont exécutées dans l'ordre alphabétique.Toutefois, aussi longtemps que je suis super précis ici, je pourrais aussi ajouter que les modifications apportées à la ligne (ou selon les lignes) dans d'autres
BEFORE
déclencheurs sont également visibles uniquement si ceux-ci sont appelés avant celui-ci.Mes conseils pour en faire un
AFTER
déclencheur est parce qu'elle est moins sujette à des complications et à moins cher si d'autres déclencheur pourrait annuler (roll back) leDELETE
mi-chemin à travers l'opération - tant qu'aucun des ci-dessus s'applique.