Vous n'êtes pas identifié(e).
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
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
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
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
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