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

SQL Oracle Discussion :

Mon trigger ne se déclenche pas


Sujet :

SQL 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 Mon trigger ne se déclenche pas
    Bonjour,
    Sous Oracle 10g, j'ai créé un trigger qui est vu OK par Oracle, mais il ne s'exécute pas, et je ne sais pas comment le tester plus précisément. Sans doute que mon trigger n'est pas correct par rapport à ce que je souhaite faire.
    Voici l'objectif :
    J'ai une table GRAPHICAL_LINE_SURF, une table GRAPHICAL_LINE_SURF_SECT et une table TRAJ_DEP.
    Je veux que sur insertion d'un record (et insertion uniquement) dans la table GRAPHICAL_LINE_SURF, il y ait copie des records de la table TRAJ_DEP dans la table GRAPHICAL_LINE_SURF_SECT, cela ne me semble pas complexe.
    Mon 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
    create or replace trigger graphical_line_surf_sect_sid 
     before insert or update of airspace_env_name,name,kind on graphical_line_surf 
     for each row 
     begin 
     insert into graphical_line_surf_sect select
     :old.airspace_env_name,:old.name,:old.kind,'Y',tpd$dep#order_number,
     :old.airspace_env_name,point_name#geo_pt,null,null,null,null,null,null from traj_dep 
     where airspace_env_name=:old.airspace_env_name and
     departure_proc_name=:old.departure_proc_name#dep_proc;
     end;
     /
    La syntaxe de l'ordre insert et son exécution a été testée en remplaçant les :old par de vrais valeurs.
    Mes tables sont les suivantes:
    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
    SQL> desc graphical_line_surf
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     AIRSPACE_ENV_NAME                         NOT NULL VARCHAR2(20)
     NAME                                      NOT NULL VARCHAR2(6)
     KIND                                      NOT NULL VARCHAR2(19)
     AIRSPACE_ENV_NAME#AIRWAY                           VARCHAR2(20)
     AIRWAY_NAME#AIRWAY                                 VARCHAR2(7)
     AIRSPACE_ENV_NAME#DEP_PROC                         VARCHAR2(20)
     DEPARTURE_PROC_NAME#DEP_PROC                       VARCHAR2(7)
     AIRSPACE_ENV_NAME#ARRIVAL                          VARCHAR2(20)
     ARRIVAL_PROC_NAME#ARRIVAL                          VARCHAR2(7)
     AIRSPACE_ENV_NAME#CTL_AREA                         VARCHAR2(20)
     CONTROLLED_AREA_NAME#CTL_AREA                      VARCHAR2(5)
     ATC_CENTRE_NAME#CTL_AREA                           VARCHAR2(8)
     AIRSPACE_ENV_NAME#N_C_AREA                         VARCHAR2(20)
     NON_CTL_AREA_NAME#N_C_AREA                         VARCHAR2(12)
     MAPS_USAGE_DESCRIPTOR                              VARCHAR2(64)
     
    SQL> desc graphical_line_surf_sect
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     AIRSPACE_ENV_NAME                         NOT NULL VARCHAR2(20)
     NAME                                      NOT NULL VARCHAR2(6)
     KIND                                      NOT NULL VARCHAR2(19)
     VISIBILITY                                NOT NULL VARCHAR2(1)
     ORDER_NUM                                 NOT NULL NUMBER(38)
     AIRSPACE_ENV_NAME#GEO_PT                           VARCHAR2(20)
     POINT_NAME#GEO_PT                                  VARCHAR2(5)
     KIND#GR_POINT                                      VARCHAR2(15)
     AIRSPACE_ENV_NAME#GR_POINT                         VARCHAR2(20)
     NAME#GR_POINT                                      VARCHAR2(16)
     LATITUDE                                           VARCHAR2(7)
     LONGITUDE                                          VARCHAR2(8)
     MAPS_USAGE_DESCRIPTOR                              VARCHAR2(64)
     
    SQL> desc dep_proc
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     AIRSPACE_ENV_NAME                         NOT NULL VARCHAR2(20)
     DEPARTURE_PROC_NAME                       NOT NULL VARCHAR2(7)
     AIRPORT_CODE#RUNWAY                       NOT NULL VARCHAR2(4)
     AIRSPACE_ENV_NAME#RUNWAY                  NOT NULL VARCHAR2(20)
     HEADING#RUNWAY                            NOT NULL NUMBER(38)
     RUNWAY_DISTINCTION#RUNWAY                          VARCHAR2(1)
     PRINT_ON_PAPER                            NOT NULL VARCHAR2(1)
     AIRCRAFT_TYPE                                      VARCHAR2(30)
     
    SQL>
    Je suis preneur d'un mode debug que je crois ne pas exister.
    Merci de votre aide

    PS : pour info, l'unicité des clés est gérée par index unique, c'est historique.

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 72
    Points : 63
    Points
    63
    Par défaut
    il me semble que dans le cas d'un insert il faut prendre le :new (le :old ne doit pas exister).
    de plus tu dis "dans le cas d'un insert uniquement" et tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    before INSERT OR UPDATE of airspace_env_name,name,kind ON graphical_line_surf
    Après si ça ne marche pas essaie de mettre une gestion d'erreur.

  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'avais aussi testé avec le :new.
    C'est vrai que j'ai ajouté le UPDATE, car le INSERT seul ne permets pas de préciser des noms de champs avant le ON <table>
    J'ai trouvé des exemples similaires, il me semble que je ne puisse faire avec cette syntaxe que des modifications sur le champ de la table visée (le ON <table>), mais j'ai trouvé l'ordre INSTEAD OF insert ... qui semble plus approprié. Je vais tester.

  4. #4
    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 820
    Points
    17 820
    Par défaut
    De ce que je lis de votre trigger, ce devrait être :
    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
    CREATE OR REPLACE TRIGGER graphical_line_surf_sect_sid 
    BEFORE INSERT ON graphical_line_surf 
    FOR EACH ROW
     
    BEGIN
     
     INSERT INTO graphical_line_surf_sect
     (AIRSPACE_ENV_NAME, NAME, KIND, VISIBILITY, ORDER_NUM, AIRSPACE_ENV_NAME#GEO_PT, POINT_NAME#GEO_PT)
     SELECT airspace_env_name
          , name
          , kind
          , 'Y'
          , tpd$dep#order_number
          , airspace_env_name
          , point_name#geo_pt
       from traj_dep 
      WHERE airspace_env_name   = :new.airspace_env_name
        AND departure_proc_name = :new.departure_proc_name#dep_proc;
     
     END;
    /
    Attention toutefois, rien de vous garanti que :new.departure_proc_name#dep_proc ne soit pas null, avec le problème que ça peut engendrer sur le where.

  5. #5
    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
    Merci, ça marche avec le trigger suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     create or replace trigger graphical_line_surf_sect_sid 
     before insert on graphical_line_surf 
     for each row 
     begin 
     insert into graphical_line_surf_sect select
     :new.airspace_env_name,:new.name,:new.kind,'Y',tpd$dep#order_number,
     :new.airspace_env_name,point_name#geo_pt,null,null,null,null,null,null from traj_dep 
     where airspace_env_name=:new.airspace_env_name and
     departure_proc_name=:new.departure_proc_name#dep_proc;
     end;
     /

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

Discussions similaires

  1. [2005] [SQL] Trigger ne se déclenche pas sur NULL
    Par azzzad dans le forum Développement
    Réponses: 5
    Dernier message: 11/02/2013, 18h30
  2. Le timeval de mon select ne se déclenche pas
    Par honeydew dans le forum Réseau
    Réponses: 2
    Dernier message: 29/10/2008, 18h33
  3. Réponses: 9
    Dernier message: 16/10/2006, 13h47
  4. mon trigger ne fonctionne pas !
    Par japi33 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 20/03/2006, 21h26
  5. [trigger] ... qui ne se déclenche pas
    Par bozo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/01/2004, 11h31

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