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

PL/SQL Oracle Discussion :

Un trigger qui se declanche pour une vue


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 145
    Points : 64
    Points
    64
    Par défaut Un trigger qui se declanche pour une vue
    Bonjour,

    Je souhaiterai cree un trigger qui se declanche quand on insert dansune table, mais qui lit ses données a partir d'une vue sur cette table la, est ce possible, et si oui, comment faire ?

    Merci

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    Vous trouvez la réponse dans ce lien :
    http://www.psoug.org/reference/instead_of_trigger.html

  3. #3

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Bonjour,

    Il n’est pas possible de interroger la table sur laquelle le trigger est positionné ni d’une manière directe ni indirecte via la vue à cause de l’erreur 04091. Et je pense que si vous posez cette question c’est parce que vous est en train d’utiliser le trigger d’une manière inapproprié.
    Pour argumenter mes propos je vous proposé de reprendre la solution propose pour contourner l’erreur induite par la table en mutation (http://sgbd.developpez.com/oracle/ora-04091/):
    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
     
    CREATE TABLE CLIENT(
        IDC INTEGER PRIMARY KEY ,
        NOM VARCHAR2 (40)
        )
    /
    CREATE TABLE VOYAGE(
        IDV INTEGER PRIMARY KEY ,
        DESTINATION VARCHAR2 (40),
        MAXPLACE INTEGER , -- nombre total de places
        PLACEDISPO INTEGER ) -- nombre de places disponibles     
    /
     
    CREATE TABLE INSCRIPTION(
        IDC INTEGER REFERENCES CLIENT(IDC),
        IDV INTEGER REFERENCES VOYAGE(IDV),
        DATERESERV DATE ,
        CONSTRAINT INSCRIPTION_PK PRIMARY KEY (IDC, IDV)
    )
    /
    INSERT INTO CLIENT(IDC, NOM) VALUES (1, 'DURAND');
    INSERT INTO CLIENT(IDC, NOM) VALUES (2, 'DUBOIS');
    INSERT INTO CLIENT(IDC, NOM) VALUES (3, 'DUGENOU');
    COMMIT ;
    -- un seul place disponoble pour aller à VENISE
    INSERT INTO VOYAGE(IDV, DESTINATION, MAXPLACE, PLACEDISPO) VALUES (10, 'VENISE', 25, 1);
    INSERT INTO VOYAGE(IDV, DESTINATION, MAXPLACE, PLACEDISPO) VALUES (11, 'PRAGUE', 20, 0);
    COMMIT ;
     
    -- déclencheur qui n'interroge plus la table mutante
    CREATE OR REPLACE TRIGGER TRIG_INSCRIPTION BEFORE INSERT ON INSCRIPTION FOR EACH ROW
    DECLARE
        NB_DISPO INTEGER ;
    BEGIN
        SELECT PLACEDISPO INTO NB_DISPO FROM VOYAGE
        WHERE IDV=:NEW.IDV;
        IF NB_DISPO < 1 THEN
            DBMS_OUTPUT.PUT_LINE('Désolé, voyage complet');
        ELSE
            UPDATE VOYAGE SET PLACEDISPO=PLACEDISPO - 1
            WHERE IDV=:NEW.IDV;
        END IF ;
    END ;
    /
    Il y a une seule modification concernant le nombre de place disponible pour aller à Venise.

    Ensuite j’ouvre une première session et je crée une première inscription sans faire la validation (commit) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -- DUGENOU aimerait bien aller à Venise :
    INSERT INTO INSCRIPTION(IDC, IDV, DATERESERV) SELECT 3, 10, TO_DATE(SYSDATE, 'DD/MM/YYYY') FROM DUAL ;
    Dans une autre session je crée une deuxième inscription pour la même destination
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -- DUBOIS aimerait bien aller à Venise :
    INSERT INTO INSCRIPTION(IDC, IDV, DATERESERV) SELECT 2, 10, TO_DATE(SYSDATE, 'DD/MM/YYYY') FROM DUAL ;
    Ensuite je valide dans chaque session (commit) et j’interroge la table du voyage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQL> select * from voyage
      2  ;
     
           IDV DESTINATION                                MAXPLACE PLACEDISPO
    ---------- ---------------------------------------- ---------- ----------
            10 VENISE                                           25         -1
            11 PRAGUE                                           20          0
    Oups ! C’est une sur réservation !

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

Discussions similaires

  1. créer un trigger pour une vue
    Par zerkos dans le forum Développement
    Réponses: 3
    Dernier message: 03/08/2012, 19h02
  2. Réponses: 6
    Dernier message: 25/07/2006, 15h40
  3. problème de code javascript pour une vue 360°
    Par tomguiss dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/03/2006, 22h50
  4. [Trigger] Comment le réaliser sur une vue ?
    Par mandale dans le forum DB2
    Réponses: 1
    Dernier message: 19/09/2005, 13h43

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