PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 11/10/2015 01:44:44

PmGs7
Membre

Impossible de détruire un enregistrement en présence d'un trigger

Bonjour à tous,

Je ne comprends pas la 'fonctionnalité' suivante, un lecteur pourrait-il l'expliquer ... je n'ose pas parler de bug ?

Dans le code suivant, la requête delete ne fonctionne pas, sauf si l'on ne crée pas le trigger !


CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;

CREATE FUNCTION entites_b_d_ft() RETURNS trigger
    LANGUAGE plpgsql
    AS $$ DECLARE  BEGIN DELETE FROM noms WHERE id_nom='xxx'; RETURN NEW ; END; $$;

CREATE TABLE entites ( entite text, id_tiers text );

CREATE TABLE noms ( id_nom text );

COPY entites (entite, id_tiers) FROM stdin;
ES1     es1
\.

CREATE TRIGGER entites_b_d BEFORE DELETE ON entites FOR EACH ROW EXECUTE PROCEDURE entites_b_d_ft();

SELECT * FROM entites;
DELETE FROM entites;
SELECT * FROM entites;


Pour info :
psql --version
psql (PostgreSQL) 9.4.4


Exécution :
dropdb es;createdb es;psql -d es -f bd_es.txt
psql:bd_es.txt:1: NOTICE:  l'extension « plpgsql » existe déjà, poursuite du traitement
CREATE EXTENSION
CREATE FUNCTION
CREATE TABLE
CREATE TABLE
COPY 1
CREATE TRIGGER
entite | id_tiers
--------+----------
ES1    | es1
(1 ligne)

DELETE 0
entite | id_tiers
--------+----------
ES1    | es1
(1 ligne)

Dernière modification par PmGs7 (11/10/2015 01:48:33)

Hors ligne

#2 11/10/2015 14:23:05

gleu
Administrateur

Re : Impossible de détruire un enregistrement en présence d'un trigger

Soit vous gardez le code de votre procédure stockée et vous utilisez un trigger AFTER, soit vous remplacez le RETURN NEW par un RETURN OLD et vous gardez le trigger BEFORE.

Et donc pas un bug.


Guillaume.

Hors ligne

#3 11/10/2015 15:59:38

PmGs7
Membre

Re : Impossible de détruire un enregistrement en présence d'un trigger

Merci bien, c'est la 1ère fois que j'utilisais un trigger BEFORE et je n'ai pas pensé à RETURN OLD.

Question subsidiaire : Comment aurais-je pu voir cette erreur ? ( message d'alerte dans un log ? )

Hors ligne

#4 11/10/2015 18:24:20

gleu
Administrateur

Re : Impossible de détruire un enregistrement en présence d'un trigger

Vous ne pouviez pas directement. Ce n'est pas une erreur en soit, donc pas de message dans les logs. Seule la lecture de la documentation aurait pu vous mettre la puce à l'oreille (pour être franc, ce n'est pas bien décrit).


Guillaume.

Hors ligne

#5 11/10/2015 22:19:19

PmGs7
Membre

Re : Impossible de détruire un enregistrement en présence d'un trigger

Même après coup je ne l'ai pas trouvé dans la doc !

Donc en résumé, pour les futurs lecteurs.

Avec ce ( un ) trigger BEFORE.
RETURN NEW ou RETURN NULL : ne fonctionne pas et pas d'erreur ( le NULL 'bloque' la suite )
RETURN OLD ou RETURN [ n'importe quoi ] : Ok

Hors ligne

Pied de page des forums