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

PL/SQL Oracle Discussion :

Exécution d'un trigger qui fonctionne mais..


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut Exécution d'un trigger qui fonctionne mais..
    Bonjour,

    J'ai crée un trigger Verif_nb_install qui vérifie que pour une application donnée, le nombre d'installations( qui est = au nombre de collaborateurs qui utilisent cette application) n'est pas > au nombre de licences pour cette application.

    Vous pouvez voir en impression écran les différentes tables concernées avec leurs données.

    Le code du trigger est le suivant

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    CREATE OR REPLACE TRIGGER Verif_nb_install
    	BEFORE INSERT OR UPDATE ON Autoriser 
    	FOR EACH ROW
     
     
    	DECLARE
    		var_nblicences application.nbdelicences%TYPE;
    		var_nbinstalls NUMBER(3);
     
     
     CURSOR CURS_INSTALL  IS SELECT COUNT(C.cId) INTO var_nbinstalls
    		FROM autoriser AU, collaborateur C, profil P, application A
    		WHERE P.pid=C.pId
    		AND AU.aId=A.aID
    		AND AU.pId=P.pId
    		GROUP BY A.nom ;
     
    BEGIN 
     
    SELECT nbdelicences INTO var_nblicences FROM autoriser, application WHERE autoriser.aid=application.aid ;
     
     
    OPEN CURS_INSTALL ;
    LOOP
     
    FETCH CURS_INSTALL INTO var_nbinstalls ;
    EXIT WHEN CURS_INSTALL%NOTFOUND; 
     
    IF (var_nblicences < var_nbinstalls)
    		THEN RAISE_APPLICATION_ERROR(-20000, 'Nombre de licences insuffisant'); 
    	END IF;
     
    END LOOP ;
     
     
    CLOSE CURS_INSTALL;
     
     
    END;

    Le déclencheur est crée sans erreur.
    Je l'ai alors testé en associant 3 collaborateurs au profil 2 et en associant le profil PID=2 à l'application 2 qui a 2 licences alors que ce profil est lié à 3 collaborateurs.
    J'ai bien un message d'erreur que vous pouvez voir en impression écran ci-jointe qui apparaît mais qui n'est pas celui que j'ai mis dans le code du trigger Verif_nb_install .


    Pouvez-vous m'expliquer pourquoi.

    Je vous en remercie beaucoup.

    Voici quelques informations complémentaires :
    -A un profil correspond un ou plusieurs collaborateurs,
    -La table autoriser est une table de jointure : à une application qui possède un nombre de licences précis, correspond un ou plusieurs profils qui chacun correspond à un ou plusieurs collaborateurs.


    Cordialement.
    new_wave
    Fichiers attachés Fichiers attachés

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Tu as un select sans exception.. c'est surement celui qui pose problème.

    SELECT nbdelicences INTO var_nblicences FROM autoriser, application WHERE autoriser.aid=application.aid => te ramène un too_many_rows


    D'ailleurs, c'est bizarre, un select sur la table du trigger, ça ne marche pas normalement : mutating table.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut trigger qui bloque
    Bonjour,
    Il y a en effet une erreur à ce niveau, du fait que mon select ramène plusieurs lignes; il faut donc créer un nouv eau curseur.
    Le trigger suivant est un peu mieux que le précédent mais j'ai un problème: l'idée est la suivante
    -insérer un enregistrement du curseur CURS_INSTALL dans les variables de sortie var_nom_appli_1, var_nbinstalls
    -insérer un enregistrement du curseur CURS_NB_LICENCES dans les variables
    var_nom_appli_2, var_nblicences

    Et comparer les valeurs de var_nom_appli1 et de var_nom_appli_2
    Tant qu'elles sont différentes, il faut continuer à parcourir le curseur CURS_NB_LICENCES jusqu'à obtenir l'égalité entre var_nom_appli_1 et var_nom_appli_2, donc à faire une instruction FETCH pour le curseur CURS_NB_LICENCES.

    Mon problème est que j'ai besoin, qu'à chaque fois qu'on revient dans la première boucle LOOP pour insérer à nouveau un enregistrement du curseur CURS_INSTALL dans les variables de sortie var_nom_appli_1 et var_nbinstalls, par un FETCH, il faudrait que je redémarre à au début du curseur CURS_NB_LICENCES.

    Voici le code implémenté pour l'instant, qui mérité d'être amélioré

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    CREATE OR REPLACE TRIGGER Verif_nb_install
    	BEFORE INSERT OR UPDATE ON Autoriser 
    	FOR EACH ROW
     
     
    	DECLARE
    		var_nblicences application.nbdelicences%TYPE;
    		var_nbinstalls NUMBER(3);
    		var_nom_appli_1 application.nom%TYPE;
    		var_nom_appli_2 application.nom%TYPE;
     
     
     CURSOR CURS_INSTALL  IS SELECT A.nom, COUNT(C.cId) 
    		FROM autoriser AU, collaborateur C, profil P, application A
    		WHERE P.pid=C.pId
    		AND AU.aId=A.aID
    		AND AU.pId=P.pId
    		GROUP BY A.nom ;
     
    CURSOR CURS_NB_LICENCES IS SELECT nom, nbdelicences FROM autoriser, application WHERE autoriser.aid=application.aid ;
     
    BEGIN 
     
    OPEN CURS_NB_LICENCES; 
     
     
    OPEN CURS_INSTALL ;
    LOOP
     
    	FETCH CURS_INSTALL INTO var_nom_appli_1, var_nbinstalls ;
    	EXIT WHEN CURS_INSTALL%NOTFOUND; 
     
    	FETCH CURS_NB_LICENCES INTO var_nom_appli_2, var_nblicences; 
    	EXIT WHEN CURS_NB_LICENCES%NOTFOUND; 
    	WHILE( var_nom_appli_1 <> var_nom_appli_2) LOOP
     
    	FETCH CURS_NB_LICENCES INTO var_nom_appli_2, var_nblicences; 
     
     
    	END LOOP; 
     
    IF (var_nblicences < var_nbinstalls)
    		THEN RAISE_APPLICATION_ERROR(-20000, 'Nombre de licences insuffisant'); 
    	END IF;
     
    END LOOP ;
     
     
    CLOSE CURS_INSTALL;
     
     
    END;
    Merci encore beaucoup de bien vouloir m'aider sur ce point.
    Cordialement.
    new_wave

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Est ce que tu as compris le fonctionnement des triggers ? je ne pense pas.

    Un trigger for each row, c'est simplement une procédure qui va s'exécuter pour chaque ligne. Les données de cette ligne avant modif sont dans les variables :old.nom_colonne, et les données après modif sont dans les variables :new.nom_colonne.

    Dans ton trigger, à aucun endroit on ne voit ces variables. C'est à dire que tu vas faire un traitement pour chaque ligne, mais que tu te moques totalement des données de cette ligne.

    Reprends ton code pour implémenter cette restriction.

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/04/2009, 11h29
  2. Réponses: 1
    Dernier message: 03/08/2007, 10h09
  3. Réponses: 3
    Dernier message: 20/03/2007, 19h54
  4. [FLASH 8] : FLA qui fonctionne mais pas le SWF
    Par xtaze dans le forum Flash
    Réponses: 9
    Dernier message: 24/10/2006, 09h14
  5. Trigger qui rollback, mais pas complètement
    Par Monstros Velu dans le forum Développement
    Réponses: 3
    Dernier message: 20/04/2006, 10h18

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