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 :

Trigger et changement de valeur sur meme table


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2018
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2018
    Messages : 69
    Par défaut Trigger et changement de valeur sur meme table
    Bonjour à tous.

    Je cherche à créer un trigger quand on choisi une ligne comme ligne par défaut et qui met les autres lignes en condition standard.

    MAP_DEFAULT=0 config standard
    MAP_DEFAULT=1 config par défault

    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
    CREATE OR REPLACE TRIGGER IND_MAP_BIU 
        Before insert or update ON IND_MANUFACTURING_PLAN     Referencing old as old new as new for each row
    Declare vCmaId gco_compl_data_manufacture.gco_compl_data_manufacture_id%type;
            vPlan_number varchar2(50);
            vPlan_version varchar2(5);
    Begin
        If inserting 
        Then If :new.ind_manufacturing_plan_id is null 
            Then :new.ind_manufacturing_plan_id := getnewid;
            End if;
            :new.a_idcre := pcs.pc_init_session.getuserini;
            :new.a_datecre := sysdate;
     
            If :new.gco_compl_data_manufacture_id is null
            Then
                begin
                    select gco_compl_data_manufacture_id
                    into vCmaId
                    from ind_map_param
                    where
                    a_idcre = pcs.pc_init_session.getuserini;
                    exception when others then 
                    vCmaId := null;
                end;
     
            :new.gco_compl_data_manufacture_id := vCmaId; 
            End if;
     
        Elsif updating 
        Then :new.a_idmod := pcs.pc_init_session.getuserini;
             :new.a_datemod := sysdate;
        End if;
        if :new.MAP_DEFAULT = 1 then
            select PMA_PLAN_NUMBER,PMA_PLAN_VERSION into vPlan_number,vPlan_version from ind_plan_management where IND_PLAN_MANAGEMENT_ID= :new.PMA_PLAN_ID;
     
            update ind_manufacturing_plan 
            set MAP_DEFAULT =0
            where   GCO_COMPL_DATA_MANUFACTURE_ID= :old.GCO_COMPL_DATA_MANUFACTURE_ID
                and IND_MANUFACTURING_PLAN_ID <> :old.IND_MANUFACTURING_PLAN_ID; --problème ici
     
            update gco_compl_data_manufacture
            set CMA_PLAN_NUMBER  =  vPLAN_NUMBER
              , CMA_PLAN_VERSION =  vPLAN_VERSION
            WHERE GCO_COMPL_DATA_MANUFACTURE_ID= :new.GCO_COMPL_DATA_MANUFACTURE_ID;
     
        end if;
    End ind_map_biu;
    Le problème est que le trigger est défini sur la même table que je souhaite modifié.
    Y a t'il une solution pour modifier des lignes d'une table sur laquelle le trigger est défini.
    Est-ce que je dois désactiver les triggers avant de l'update pour éviter une récursivité?

    Merci
    Bonne journée

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    "Le problème est que le trigger est défini sur la même table que je souhaite modifié."
    Et cela pose quoi comme pb? Il y a un message d'erreur à la compilation, à l'exécution?

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2018
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2018
    Messages : 69
    Par défaut
    ORA-04091: table IND_MANUFACTURING_PLAN is mutating, trigger/function may not see it

    Si j'enlève la partie suivante de mon trigger il n'y a pas de message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update ind_manufacturing_plan 
            set MAP_DEFAULT =0
            where   GCO_COMPL_DATA_MANUFACTURE_ID= :old.GCO_COMPL_DATA_MANUFACTURE_ID
                and IND_MANUFACTURING_PLAN_ID <> :old.IND_MANUFACTURING_PLAN_ID; --problème ici

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Quand vous travaillez sur la table que vous êtes en train de modifier, remplacez simplement les valeurs :old / :new avec ce que vous voulez.
    Dans votre cas :
    Devrait suffire à la place de l'update.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2018
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2018
    Messages : 69
    Par défaut
    Merci de votre réponse mais elle ne correspond pas à mes attentes.
    Je ne souhaite pas modifié la ligne affecter au déclenchement du trigger mais toutes les autres lignes de la table.
    C'est pour ça que j'ai la vérification sur la clé primaire qui doit être différente de :old.IND_MANUFACTURING_PLAN_ID, (je pense que dans ce cas mettre old ou new importe peu vu qu'on entre dans ce cas que des une situation de mise à jour)
    J'ai regardé la FAQ disponible pour le forum et je suis en train d'essayer la solution avec la table temporaire.

    De tel sorte qu'une contrainte d'unicité de configuration par défaut soit créé par le trigger et pas par un index qui génèrerait des messages d'erreurs.

    1 plan par défaut, le reste en standard pour toutes les liaisons attachées à la même clé GCO_COMPL_DATA_MANUFACTURE_ID.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Si c'est ce que vous voulez faire, c'est un mauvais design, qui ne sera pas performant et donc vous appréciez déjà une limite.

    Gérez ce MAP_DEFAULT dans une autre table qui ne contiendra que deux colonnes, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create table ind_manufacturing_plan_default
    ( GCO_COMPL_DATA_MANUFACTURE_ID not null
    , IND_MANUFACTURING_PLAN_ID     not null
    , constraint pk_ind_manfct_plan_def
        primary key (GCO_COMPL_DATA_MANUFACTURE_ID)
    , constraint fk_ind_manfct_plan_def
        foreign key (IND_MANUFACTURING_PLAN_ID)
        references ind_manufacturing_plan (IND_MANUFACTURING_PLAN_ID)
    );
     
    create /* unique */ index fk_ind_manfct_plan_def
    on ind_manufacturing_plan_default (IND_MANUFACTURING_PLAN_ID);
    Et dans votre trigger, à la place de l'update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     merge into ind_manufacturing_plan_default tgt
     using (select :new.GCO_COMPL_DATA_MANUFACTURE_ID
                 , :new.IND_MANUFACTURING_PLAN_ID
             from dual) src
        on (src.GCO_COMPL_DATA_MANUFACTURE_ID = tgt.GCO_COMPL_DATA_MANUFACTURE_ID)
      when matched then update
       set tgt.IND_MANUFACTURING_PLAN_ID = src.IND_MANUFACTURING_PLAN_ID
      when not matched then
    insert (tgt.GCO_COMPL_DATA_MANUFACTURE_ID, tgt.IND_MANUFACTURING_PLAN_ID)
    values (src.GCO_COMPL_DATA_MANUFACTURE_ID, src.IND_MANUFACTURING_PLAN_ID);

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

Discussions similaires

  1. jointure sur meme table
    Par edenyorke dans le forum Hibernate
    Réponses: 10
    Dernier message: 11/06/2007, 14h36
  2. [VBA-E] RechercheV si changement de valeur sur une cellule
    Par bonilla dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/01/2007, 16h22
  3. Soustraction de valeurs dans meme table, meme colonne
    Par zoubaf dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/08/2006, 11h51
  4. lien sur meme table et comptage
    Par gildemont dans le forum Oracle
    Réponses: 5
    Dernier message: 10/03/2006, 15h14
  5. Réponses: 2
    Dernier message: 23/01/2006, 11h55

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