Déclencheurs AFTER de PostgreSQL
Les déclencheurs dans PostgreSQL sont des fonctions qui s'exécutent automatiquement en réponse à des événements spécifiques sur un tableau, tels que INSERT, UPDATE, ou DELETE. Un déclencheur AFTER est exécuté après la fin de l'événement déclencheur, ce qui lui permet d'accéder à l'état final des données.
Utilisation
Les déclencheurs APRÈS sont utilisés lorsque vous devez effectuer des actions après un événement de modification des données, en veillant à ce que toute opération dépendante ne se produise qu'une fois l'événement initial terminé avec succès. Ils sont définis à l'aide de l'instruction CREATE TRIGGER
.
CREATE TRIGGER trigger_name
AFTER event [OR event ...]
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();
Dans cette syntaxe, AFTER event
spécifie l'événement (INSERT, UPDATE, DELETE) qui active le déclencheur, et function_name()
est la fonction à exécuter après l'événement.
Exemples
1. Déclencheur de base AFTER INSERT
CREATE OR REPLACE FUNCTION log_new_user()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO user_logs(user_id, action, log_time)
VALUES (NEW.id, 'User Created', NOW());
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
EXECUTE FUNCTION log_new_user();
Cet exemple tableau l'entrée d'un nouvel utilisateur dans user_logs
après une insertion dans le tableau users
.
2. Déclencheur AFTER UPDATE
CREATE OR REPLACE FUNCTION update_inventory_log()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO inventory_logs(product_id, change, log_time)
VALUES (NEW.product_id, NEW.quantity - OLD.quantity, NOW());
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER after_inventory_update
AFTER UPDATE ON inventory
FOR EACH ROW
EXECUTE FUNCTION update_inventory_log();
Ce déclencheur tableau la modification de la quantité d'un produit à inventory_logs
après la mise à jour du tableau inventory
.
3. Déclencheur AFTER DELETE avec logique conditionnelle
CREATE OR REPLACE FUNCTION log_deleted_order()
RETURNS TRIGGER AS $$
BEGIN
IF OLD.status = 'completed' THEN
INSERT INTO order_logs(order_id, action, log_time)
VALUES (OLD.id, 'Completed Order Deleted', NOW());
END IF;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER after_order_delete
AFTER DELETE ON orders
FOR EACH ROW
EXECUTE FUNCTION log_deleted_order();
Cet exemple tableau la suppression des commandes terminées du tableau orders
, uniquement si l'état de la commande est "terminé".
Conseils et bonnes pratiques
- Utilisez les déclencheurs AFTER pour les opérations dépendantes. Appliquez-les lorsque des actions ultérieures dépendent de l'achèvement de la transaction initiale.
- Veillez à ce que les fonctions de déclenchement soient efficaces. Veillez à ce que la fonction exécutée par le déclencheur soit optimisée pour éviter de ralentir les transactions.
- Évitez les logiques complexes. Simplifier la logique des déclencheurs afin de préserver la clarté et la facilité de maintenance.
- Testez soigneusement les déclencheurs. Assurez-vous que les déclencheurs n'affectent pas involontairement la logique de l'application en les testant de manière exhaustive.
- Documentez le comportement des déclencheurs. Conservez une documentation claire sur la fonction de chaque déclencheur, en particulier dans les applications de grande envergure.
- Contrôler l'impact sur les performances. Utilisez des outils de journalisation ou de surveillance pour suivre l'impact des déclencheurs sur les performances des bases de données de production.
- Comprendre les interactions entre les transactions. Les déclencheurs AFTER font partie de la transaction ; si une erreur survient dans la fonction de déclenchement, la transaction entière peut être annulée.
- Tenez compte des limites. Soyez attentif aux conflits potentiels avec les contraintes de clés étrangères ou les actions en cascade lorsque vous utilisez des déclencheurs AFTER.
- Gérer le cycle de vie des déclencheurs. Sachez comment désactiver ou supprimer un déclencheur lorsqu'il n'est plus nécessaire en utilisant
ALTER TABLE
ouDROP TRIGGER
.