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

Oracle Discussion :

Problème sur un Trigger


Sujet :

Oracle

  1. #1
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut Problème sur un Trigger
    Bonjour,

    J'ai un petit soucis avec un trigger. Je débute encore dans ce domaine et j'ai du mal.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TRIGGER MINFORIBTRIGGER 
        ON MINFORIB 
        AFTER INSERT, UPDATE, DELETE
    AS
    -- Insertion dans la table de suivi
    INSERT INTO SUIVIRIB (SRIB_NO, SRIB_NOPK, SRIB_BNQ_ETAB, SRIB_BNQ_GUIC, SRIB_IBQ_CODE, SRIB_TITUL, SRIB_NOCPTE, SRIB_CLE, SRIB_TYPE, SRIB_MAJ_ID, SRIB_MAJ_DT, SRIB_DAT_INCID)
     
    SELECT RIB_NO_PK, RIB_BNQ_ETAB, RIB_BNQ_GUIC, RIB_IBQ_CODE, RIB_TITUL, RIB_NOCPTE, RIB_CLE, RIB_TYPE, MAJ_ID, MAJ_DT, RIB_DAT_INCID 
    FROM MINFORIB
    -- rollback en cas d'erreur
    IF @@ERROR <> 0
      ROLLBACK TRANSACTION
    END


    J'essai de faire un trigger qui va m'insérer dans une autre table toute la ligne qui est modifiée par un utilisateur.

    Je veux faire ce trigger sur une bas Oracle 9.2.

    Merci d'avance pour votre aide.
    Isa

  2. #2
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Salut,
    je suis pas expert Oracle mais ca devrait te donner un code du genre :
    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 OR REPLACE TRIGGER MINFORIBTRIGGER 
    AFTER INSERT OR DELETE  OR UPDATE ON MINFORIB 
    FOR EACH ROW
    WHEN (1 = 1)
    DECLARE
        monid integer;
    BEGIN
     
     IF INSERTING THEN
      monid := :new.SRIB_NO;
     ELSE
      monid = :old.SRIB_NO;
     END IF;
     -- Insertion dans la table de suivi
     INSERT INTO SUIVIRIB (SRIB_NO, SRIB_NOPK, SRIB_BNQ_ETAB,  SRIB_BNQ_GUIC, SRIB_IBQ_CODE, SRIB_TITUL, SRIB_NOCPTE, SRIB_CLE, SRIB_TYPE, SRIB_MAJ_ID, SRIB_MAJ_DT, SRIB_DAT_INCID)
     SELECT RIB_NO_PK, RIB_BNQ_ETAB, RIB_BNQ_GUIC, RIB_IBQ_CODE, RIB_TITUL, RIB_NOCPTE, RIB_CLE, RIB_TYPE, MAJ_ID, MAJ_DT, RIB_DAT_INCID
    FROM MINFORIB WHERE SRIB_NO = monid;
     -- rollback en cas d'erreur
     IF @@ERROR <> 0 THEN
      ROLLBACK TRANSACTION;
     END IF;
    END;
    J'y ai ajouter un WHERE SRIB_NO= monid, en supposant que SRIB_NO soit ta clef primaire, ainsi qu'un test d'insert ou autre pour recuperer l'id (old ou new)

    A voir avec les spécialiste, mais c'est une piste.
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  3. #3
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    heuu, j'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ORA-00922: option erronée ou absente
     
     
    SP2-0552: Variable de lien "OLD" non déclarée.
    On le déclare comment le "OLD"?


    J'ai essayé de faire ceci mais helas cela ne change rien!!

    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
    CREATE OR REPLACE TEST_ADMIN.TRIGGER TEST_ADMIN.MINFORIBTRIGGER 
    BEFORE INSERT OR DELETE  OR UPDATE ON TEST_ADMIN.MINFORIB 
    REFERENCING OLD AS OLD NEW AS NEW 
    FOR EACH ROW 
    WHEN (1 = 1) 
    DECLARE 
        monid integer; 
    BEGIN 
     
     IF INSERTING THEN 
      monid := :new.SRIB_NO; 
     ELSE 
      monid := :old.SRIB_NO; 
     END IF; 
     -- Insertion dans la table de suivi 
     INSERT INTO SUIVIRIB (SRIB_NOPK, SRIB_BNQ_ETAB,  SRIB_BNQ_GUIC, SRIB_IBQ_CODE, SRIB_TITUL, SRIB_NOCPTE, SRIB_CLE, SRIB_TYPE, SRIB_MAJ_ID, SRIB_MAJ_DT, SRIB_DAT_INCID) 
     SELECT RIB_NO_PK, RIB_BNQ_ETAB, RIB_BNQ_GUIC, RIB_IBQ_CODE, RIB_TITUL, RIB_NOCPTE, RIB_CLE, RIB_TYPE, MAJ_ID, MAJ_DT, RIB_DAT_INCID 
    FROM MINFORIB WHERE SRIB_NO = monid; 
     -- rollback en cas d'erreur 
     IF @@ERROR <> 0 THEN 
      ROLLBACK TRANSACTION; 
     END IF; 
    END;
    Merci d'avance pour votre aide.

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Logiquement, le :old ne doit pas être accessible en insertion ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Ben en fait si j'enlève le old, j'ai le même problème avec le new.

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    et en BEFORE au lieu d'AFTER ?

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    IF @@ERROR <> 0
    @@ ça doit pas trop marcher si ?

  8. #8
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    C'es la même chose que je mettre BEFORE ou AFTER.
    Pour le je ne sais pas.

    Comme je le disais dans mon premier message je débute donc je ne sais pas trop comment m'y prendre.

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Relis la doc, il y a énormément d'erreur dans ce script. Pour rappel, le forum n'a pas pour vocation de répondre aux problèmes de déboggage

  10. #10
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Ben dans ce cas je la trouve ou cette doc, et je dois aller poser ma question ou pour que quelqu'un m'aide a faire mon trigger????

    Tout ce que je demande c'est qu'on m'explique comment on fait un trigger et pourquoi ce que j'ai fait ne va pas, ou sont mes erreurs....

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    On pourrait en effet expliquer tes erreurs mais ça ne t'aidera pas pour les erreurs que tu feras ensuite si tu ne te documentes pas.

    Il n'est pas question de refuser de te répondre mais de t'inviter à te documenter pour progresser. Le forum a de nombreux exemple et la doc est sur le site d'Oracle : http://otn.oracle.com/pls/db92/db92.homepage?remark=tahiti

    N'oublie pas les tutoriels Oracle également

    Bon courage

  12. #12
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Ok j'ai cherché de la doc mais j'ai pas trouvé grand chose. Je vais faire mes recherches.

    Merci.

  13. #13
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Bon je pense qu'il y a du mieux mais j'ai encore un peu de mal.
    J'en suis arrivé à ceci :
    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
    CREATE OR REPLACE TRIGGER TEST_ADMIN.MINFORIBTRIGGER 
    BEFORE INSERT OR DELETE  OR UPDATE ON TEST_ADMIN.MINFORIB 
    REFERENCING OLD AS OLD NEW AS NEW 
    FOR EACH ROW 
    WHEN (1 = 1) 
    DECLARE 
        sribID integer; 
    BEGIN 
     
     sribID := :new.SRIB_NO -  :old.SRIB_NO; 
     
     -- Insertion dans la table de suivi 
     INSERT INTO SUIVIRIB (SRIB_NO, SRIB_NOPK, SRIB_BNQ_ETAB,  SRIB_BNQ_GUIC, SRIB_IBQ_CODE, SRIB_TITUL, SRIB_NOCPTE, SRIB_CLE, SRIB_TYPE, SRIB_MAJ_ID, SRIB_MAJ_DT, SRIB_DAT_INCID) 
     VALUES(sribID, :new.RIB_NO_PK, :new.RIB_BNQ_ETAB, :new.RIB_BNQ_GUIC, :new.RIB_IBQ_CODE, :new.RIB_TITUL,:new.RIB_NOCPTE, :new.RIB_CLE, :new.RIB_TYPE, :new.MAJ_ID, :new.MAJ_DT, :new.RIB_DAT_INCID )
     
    EXCEPTION
      ROLLBACK TRANSACTION  
    END;
    Mais j'ai des erreurs de compilation et le trigger ne fonctionne pas.

    Pour vous c'est a quel niveau qu'il y a le ou les problèmes, j'ai beau regarder tout plein d'exemples mais je ne saisi pas tout...

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    le DECLARE ne doit pas être mentionné et sans erreur on ne peut pas mieux t'aider

  15. #15
    Membre régulier Avatar de Isa31
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 267
    Points : 109
    Points
    109
    Par défaut
    Pour le je crois que je dois le laisser.
    Pour les erreurs j'aimerais bien moi aussi savoir d'ou elles viennent mais j'ai juste le message suivant
    Avertissement : Déclencheur créé avec erreurs de compilation.

  16. #16
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    si tu mettais en commentaire toutes les lignes et tu enleve progressivement jusqu'a decouvrir l'erreur ?
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  17. #17
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Ajoute : show err à la fin du code du trigger.

    Tu peux me croire, j'ai un petit peu d'expérience et le DECLARE ne doit pas être mentionné

    http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96624/01_oview.htm#1033

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER audit_sal
       AFTER UPDATE OF sal ON emp
       FOR EACH ROW
    BEGIN
       INSERT INTO emp_audit VALUES ...
    END;

  18. #18
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par hpalpha
    si tu mettais en commentaire toutes les lignes et tu enleve progressivement jusqu'a decouvrir l'erreur ?
    la bonne vielle méthode dite : du bourrin


  19. #19
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Points : 741
    Points
    741
    Billets dans le blog
    1
    Par défaut
    pour infos sur les triggers ( cf doc pl/sql)

    un trigger est composé de bloc pl/sql ou fait appel à des procédures
    stockées .

    sont interdits : les commandes de définitions de données : create,alter..
    les instructions de gestion des transactions : commit,rollback,savepoint....

    pour voir les erreurs, c' est la commande
    à mon avis ta clause when ne sert à rien ...

    cdlt

  20. #20
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXCEPTION
      ROLLBACK TRANSACTION
    est incorrecte egalement

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème sur un trigger d'insertion
    Par houda_dd dans le forum PL/SQL
    Réponses: 6
    Dernier message: 31/01/2012, 02h14
  2. Problème sur un trigger
    Par anthonyplay dans le forum PL/SQL
    Réponses: 3
    Dernier message: 30/11/2010, 16h51
  3. Problème sur un trigger
    Par dnboa dans le forum PL/SQL
    Réponses: 7
    Dernier message: 21/11/2008, 16h22
  4. Probléme sur un trigger
    Par izghad_06 dans le forum PL/SQL
    Réponses: 8
    Dernier message: 10/06/2008, 11h46
  5. Problème sur les triggers
    Par loic20h28 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 22/01/2008, 18h37

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