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 :

Modifier table qui lance un TRIGGER (fonction ou procédure)


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 98
    Par défaut Modifier table qui lance un TRIGGER (fonction ou procédure)
    Bonjour à tous !!!

    je voudrais créer un TRIGGER qui modifie la table qui le définit.
    Ou un TRIGGER qui appelle une fonction ou une procédure qui modifie cette table.

    J'ai essayé PRAGMA AUTOMOUS_TRANSACTION dans le TRIGGER, la fonction et la procédure, rien y fit...

    J'ai ORA-00060: Détection d'interblocage pendant l'attente d'une ressource

    Je me demandais donc s'il existait un moyen de lancer une procédure après que l'instruction soit réalisée. Un truc genre "TRIGGER AFTER COMMIT" ??? ca éviterait l'accès simultané.

    Voila si qqun à une idée de comment faire...

    Meeeeerci :o

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Pourrais-tu détailler d'avantage le code qui déclenche le trigger, le type de trigger que tu crées (BEFORE, AFTER, STATEMENT) et le code du trigger ?

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 98
    Par défaut
    Oki :o

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table P_PERSONNEL_ENTITES_LIBELLES_C(
        P_PELC_ID_ENTITE VARCHAR2(60) NOT NULL,
        P_PELC_ID_PERSONNE NUMBER NOT NULL, 
        P_PELC_ID_FONCTION VARCHAR2(4),
        P_PELC_NUMERO_P_E NUMBER(2) DEFAULT 0,
     
        CONSTRAINT UNQ_P_PELC UNIQUE (P_PELC_ID_ENTITE, P_PELC_ID_PERSONNE, P_PELC_CODE),
        CONSTRAINT FK_P_PELC_P_ENT FOREIGN KEY (P_PELC_ID_ENTITE) 
    REFERENCES P_ENT(P_ENT_ID_ENTITE),
        CONSTRAINT FK_P_PELC_P_PERSONNEL FOREIGN KEY (P_PELC_ID_PERSONNE) REFERENCES P_PERSONNEL(ID_PERSONNE),
        CONSTRAINT FK_P_PELC_P_LIBELLES_CODES FOREIGN KEY (P_PELC_CODE) REFERENCES P_LIBELLES_CODES(CODE))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER TRIG_P_PELC_BEFORE_IU
        AFTER INSERT OR UPDATE
          ON P_PERSONNEL_ENTITES_LIBELLES_C
          FOR EACH ROW
          DECLARE
             PRAGMA AUTONOMOUS_TRANSACTION;  
             BEGIN
    	PROC_P_PELC_MAJ_NUMEROS(:new.P_PELC_ID_ENTITE, :new.P_PELC_ID_PERSONNE, :new.P_PELC_CODE, :new.P_PELC_NUMERO_P_E);
             END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE PROCEDURE PROC_P_PELC_MAJ_NUMEROS (idEntite VARCHAR2, idPersonne VARCHAR2, idFonction VARCHAR2, 
    varP_PELC_NUMERO_P_E NUMBER)
     	IS
    	PRAGMA AUTONOMOUS_TRANSACTION;  
    	monRecord NUMBER := 1;
    	BEGIN 
         	  UPDATE  P_PERSONNEL_ENTITES_LIBELLES_C 	
      	  SET  P_PELC_NUMERO_P_E=varP_PELC_NUMERO_P_E
    	  WHERE	P_PELC_ID_ENTITE=idEntite
    	  AND	P_PELC_ID_PERSONNE=idPersonne
                      AND	P_PELC_CODE<>idFonction;
                      COMMIT;
    	END;
    Voila, donc, je veux qu'il y'ait le meme numero pour un même (idEntite + idPersonne), quelle que soit le idFonction.

    Merci

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    à quoi sert la procédure ??? Tu fais la mise à jour qui déclenche le trigger non ?

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 98
    Par défaut
    En fait, je m'suis dit que si PRAGMA AUTONOMOUS_TRANSACTION; ne fonctionnait pas au niveau du trigger, il marcherait peut-être au niveau d'une procédure...

    Et l'update se fait sur un enregistrement mais la procédure le propage sur les enrgistrement ayant le même (idEntite+idPersonne)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    alors là, je te dirais que tu as un gros problème de modélisation en ayant mélangé maitre et détail dans une seule table

    Essaye avec un trigger BEFORE insert

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 98
    Par défaut
    Maitre et détails... En gros j'ai plusieures fois le même (idEntite+idPersonne+numero) dans ma table, c'est ca ???
    Si oui, ca ne m'arrange pas de changer ma structure pcq en fait, je l'ai simplifié car j'ai en réalité 2 numéros pour (idEntite+idPersonne), 2 pour (idEntite+idFonction) et 2 pour (idFonction+idPersonne) et que si je scinde le tout, je me retrouve avec 3 tables supplémentaires...

    J'ai essayé le BEFORE INSERT mais ca ne marche pas (interBlockage)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est surement à cause des FK mais je n'arrive pas à mettre le doigt dessus

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 98
    Par défaut
    Je vois pas trop ce que les FK ont à voir...
    Note: les select fonctionnent dans la procédure.

    Me trompe-je en pensant que c'est modifier la table "insertée" qui pose problême ?

    En tout cas merci Fred_D de prendre du temps pour mon cas !!! :respect: (j'ai pas trouvé de smiley )

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    peut tu mettre le code qui déclenche le trigger STP ?

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 98
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO P_PELC VALUES ( 'AAA', 18266, '0803', 6)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE P_PELC SET P_PELC_NUMERO_P_E=6 WHERE P_PELC_ID_ENTITE='AAA' AND P_PELC_ID_PERSONNE=18266 AND P_PELC_ID_FONCTION='0113'
    Il devrait donc mettre le numero à 6 pour tout les record où P_PELC_ID_ENTITE='AAA' et P_PELC_ID_PERSONNE=18266

  12. #12
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 98
    Par défaut
    j'ai enlevé le BEFORE UPDATE, je n'ai laissé que le BEFORE INSERT, et là, ca fonctionne !!!
    En fait, et ca semble logique, le trigger était appelé récursivement via l'update de la procédure et ce indéfiniment...

    Je cherche donc maintenant à lancer l'update de la procédure sans lancer le trigger...

    Je reste néanmoins à l'écoute de toute alternative.

Discussions similaires

  1. une table qui contient un champ modifiable
    Par john_wili dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 22/02/2009, 12h08
  2. trigger qui lance un .bat
    Par orafrance dans le forum Développement
    Réponses: 5
    Dernier message: 30/10/2008, 21h36
  3. creer un bouton qui lance des requetes en fonction d'une colonne
    Par akdmks dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/12/2007, 17h41
  4. Réponses: 4
    Dernier message: 10/06/2007, 09h53
  5. Réponses: 2
    Dernier message: 13/06/2006, 20h47

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