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
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
Salut,
Vous trouvez la réponse dans ce lien :
http://www.psoug.org/reference/instead_of_trigger.html
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/):
Il y a une seule modification concernant le nombre de place disponible pour aller à Venise.
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 ; /
Ensuite j’ouvre une première session et je crée une première inscription sans faire la validation (commit) :
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 -- DUGENOU aimerait bien aller à Venise : INSERT INTO INSCRIPTION(IDC, IDV, DATERESERV) SELECT 3, 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 -- DUBOIS aimerait bien aller à Venise : INSERT INTO INSCRIPTION(IDC, IDV, DATERESERV) SELECT 2, 10, TO_DATE(SYSDATE, 'DD/MM/YYYY') FROM DUAL ;
Oups ! C’est une sur réservation !
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager