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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    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 Expert 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 : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    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".

  3. #3
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    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 Expert 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 : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    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.

  5. #5
    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
    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 éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    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