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

Administration Oracle Discussion :

trigger pour modifier une valeur après création du record


Sujet :

Administration Oracle

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut trigger pour modifier une valeur après création du record
    Bonjour,
    Avec une application python travaillant en oracle 10g, A travers une IHM, je saisi des infos correspondant à une table 'AIRPORT', mais des champs mandatory sont cachés : ils vont être créé avec une valeur par défaut pour que le 'insert' se fasse et je compte utiliser le trigger suivant pour remettre la bonne valeur dans ce champ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace trigger airport_creation
    after insert on airport
    for each row when (old.aixm_identifier = 'x')
    begin
    	:new.aixm_identifier := sys_guid();
    end;
    /
    Mais oracle me signale l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-04084: cannot change NEW values for this trigger type
    Comment puis je écrire ce trigger ?
    Merci

  2. #2
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Je ne suis pas un expert en triggers mais plusieurs points me paraissent scabreux :

    - Tu met une condition sur :old dans un trigger de type "after INSERT". Le :old est il me semble toujours null dans ce cas.

    - Tu modifies ton enregistrement après son insertion, et c'est à mon avis cela qui cause l'erreur. Tu devrais utiliser un trigger de type "before INSERT".
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  3. #3
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    J'ai essayé avec "before insert", le trigger est effectivement créé, mais il ne se déclenche pas lors de l'ajout d'un record ...
    Merci

  4. #4
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Cf ma première remarque, ton when ne sera jamais évalué à true.

    J'imagine que tu veux dire que si le champ aixm_identifier de l'enregistrement à insérer est 'x' alors tu exécutes le trigger ? Dans ce cas il ne faut pas mettre :old mais bien :new.
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 817
    Points
    17 817
    Par défaut
    Sinon au lieu d'utiliser un déclencheur vous pouvez rajouter une contrainte DEFAULT sur votre table, et ne pas appeler la colonne lors de vos inserts :
    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
    create table tab
    (
        col1    varchar2(32 char) default sys_guid() not null,
        col2    number(1)
    );
    -- Table created.
     
    insert into tab (col2) values (1);
    -- 1 row created.
     
    commit;
    -- Commit complete.
     
    select col1, col2 from tab;
     
    COL1                                   COL2
    -------------------------------- ----------
    DAF92FA8B7A44AA1A438014B1F2D1581          1
    -- 1 row selected.
     
    drop table tab;
    -- Table dropped.

  6. #6
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Bravo pour la contrainte DEFAULT que je connaissais pas, cela me simplifie plein de choses.
    merci encore

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

Discussions similaires

  1. recordset pour modifier une valeur d'un champ
    Par YannC dans le forum VBA Access
    Réponses: 20
    Dernier message: 04/07/2012, 10h41
  2. [Débutant] Modifier une valeur pour l'affichage
    Par extensite dans le forum ASP.NET MVC
    Réponses: 0
    Dernier message: 26/06/2012, 16h41
  3. Réponses: 6
    Dernier message: 31/01/2012, 18h38
  4. [Designer V5-V6] Création Variable pour proratiser une valeur
    Par pouchet64 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/05/2010, 17h49
  5. [MySQL] condition de temps pour modifier une valeur
    Par Beniti dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 29/05/2008, 08h13

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