IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Problème avec un trigger


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut Problème avec un trigger
    Bonjour,

    Voila mon problème est le suivant, je veux créer un trigger qui me permette d'empêcher la mise à jour ou la suppression du compte root de mon site.

    Voici donc celle que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE OR REPLACE FUNCTION trig_root_member() RETURNS TRIGGER AS
    $trig_root_member$
    	BEGIN
    		IF OLD.pseudo = 'root' THEN
                        RETURN NULL;
    		ELSE
    		    RETURN OLD;
                    END IF;
    	END;
    $trig_root_member$ LANGUAGE plpgsql;
     
    DROP TRIGGER IF EXISTS trig_root_member ON membre;
    CREATE TRIGGER trig_root_member BEFORE DELETE OR UPDATE ON membre
    FOR EACH STATEMENT
    EXECUTE PROCEDURE trig_root_member();
    Or lorsque j'essaie de modifier ou supprimer mon compte root postgresql me met cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ERREUR: l'enregistrement « old » n'est pas encore affectée
    État SQL :55000
    Détail :La structure de ligne d'un enregistrement pas encore affecté est indéterminée.
    Contexte : fonction PL/pgsql « trig_root_member », ligne 2 à IF
    Et je ne comprend pas cette erreur Quelqu'un aurait une idée à me proposer ? Merci d'avance

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Salut.

    Personnellement, j'utiliserai un RAISE EXCEPTION pour empêcher la mise à jour ou la suppression...

    Voici comment j'aurai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE FUNCTION trig_root_member() RETURNS TRIGGER AS $$
    	BEGIN
    		IF OLD.pseudo = 'root' THEN
                        RAISE EXCEPTION 'message d\'erreur ...'; -- stop les traitements
                    END IF;
                    RETURN NEW;
    	END; 
    $$ LANGUAGE plpgsql;
     
    CREATE TRIGGER trig_root_member BEFORE INSERT
    	ON auteur FOR EACH ROW
    	EXECUTE PROCEDURE trig_root_member();
    Cordialement,
    Idriss

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faudrait un trigger FOR EACH STATEMENT au lieu de FOR EACH ROW dans la définition du trigger, sans quoi NEW et OLD ne sont pas accessibles.
    C'est la raison du message d'erreur.

    EDIT: lire Il faudrait un trigger FOR EACH ROW au lieu de FOR EACH STATEMENT.

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut lancement du php
    Citation Envoyé par estofilo Voir le message
    Il faudrait un trigger FOR EACH STATEMENT au lieu de FOR EACH ROW dans la définition du trigger, sans quoi NEW et OLD ne sont pas accessibles.
    C'est la raison du message d'erreur.
    Ou peut être le contraire, non ? Il utilise FOR EACH STATMENT, il a une erreur. J'utilise FOR EACH ROW et j'ai bien accès aux objets NEW et OLD, non ?

    Cordialement,
    Idriss

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message
    Ou peut être le contraire, non ? Il utilise FOR EACH STATMENT, il a une erreur. J'utilise FOR EACH ROW et j'ai bien accès aux objets NEW et OLD, non ?
    Euh oui désolé j'ai écrit l'inverse de ce que je voulais.
    C'est bien FOR EACH ROW qu'il faut utiliser.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Merci c'était exactement ce qu'il me fallait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec un trigger
    Par fayerne dans le forum PL/SQL
    Réponses: 2
    Dernier message: 13/01/2008, 00h36
  2. Réponses: 4
    Dernier message: 27/11/2007, 15h32
  3. probléme avec un trigger
    Par sofiane1111 dans le forum Oracle
    Réponses: 4
    Dernier message: 14/06/2007, 11h17
  4. Problème avec un trigger...
    Par nasgektw dans le forum Développement
    Réponses: 3
    Dernier message: 28/04/2006, 17h41
  5. [T-SQL] problème avec un trigger
    Par karine77 dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 26/09/2005, 10h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo