Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/10/2007, 13h05   #1
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 145
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 145
Points : 31
Points : 31
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
redabadache3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2007, 13h44   #2
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Vous trouvez la réponse dans ce lien :
http://www.psoug.org/reference/instead_of_trigger.html
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2007, 13h49   #3
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
ou là : http://sheikyerbouti.developpez.com/pl_sql/?page=Chap6
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2007, 09h10   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 319
Points : 5 837
Points : 5 837
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 :
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 :
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 :
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 :
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 !
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h42.


 
 
 
 
Partenaires

Hébergement Web