· 4 years ago · May 13, 2021, 11:16 PM
1/*
2*Auteur: Charles Morin, Pierre-Raphael Boileau
3*Remise: 17 mai 2021
4*/
5USE BDB44Charles
6
7/*
8C) Programmation d’un Déclencheur (35 points)
9*/
10DROP TABLE IF EXISTS TESTPRODUITS
11DROP TABLE IF EXISTS TESTEXEMPLAIRES
12
13SELECT * INTO TESTPRODUITS FROM TP3VIDEOPRODUITS
14SELECT * INTO TESTEXEMPLAIRES FROM TP3VIDEOEXEMPLAIRES
15
16/*
17Sur une modification de la table EXEMPLAIRES,
18modifier la quantité en stock de la table PRODUITS de la façon suivante :
19*/
20GO
21CREATE TRIGGER trgModifStock
22On TESTEXEMPLAIRES
23AFTER insert, delete
24AS
25BEGIN
26
27 DECLARE @noProduit VARCHAR(5)
28 --INSERT - Exemplaires
29 DECLARE curInsererProduits CURSOR
30 FOR SELECT noproduit FROM inserted
31 --DELETE - Exemplaires
32 DECLARE curDeleterProduits CURSOR
33 FOR SELECT noproduit FROM deleted
34
35 --INSERT - Exemplaires
36 OPEN curInsererProduits
37 FETCH NEXT FROM curInsererProduits INTO @noProduit
38 WHILE @@FETCH_STATUS = 0
39 BEGIN
40 BEGIN TRANSACTION
41 IF(@noProduit IS NOT NULL)
42 UPDATE TESTPRODUITS
43 SET qtestock = qtestock + 1
44 WHERE noproduit = @noProduit;
45 FETCH NEXT FROM curInsererProduits INTO @noProduit
46 COMMIT;
47 END
48 CLOSE curInsererProduits
49 DEALLOCATE curInsererProduits
50
51 --DELETE - Exemplaires
52 OPEN curDeleterProduits
53 FETCH NEXT FROM curDeleterProduits INTO @noProduit
54 WHILE @@FETCH_STATUS = 0
55 BEGIN
56 BEGIN TRANSACTION
57 IF(@noProduit IS NOT NULL)
58 BEGIN
59 BEGIN TRANSACTION
60 IF((SELECT qtestock FROM TESTPRODUITS WHERE noproduit = 'C0004') - 1 >= 0)
61 BEGIN
62 UPDATE TESTPRODUITS
63 SET qtestock = qtestock - 1
64 WHERE noproduit = @noProduit;
65 COMMIT;
66 END
67 END
68 FETCH NEXT FROM curDeleterProduits INTO @noProduit
69 END
70 CLOSE curDeleterProduits
71 DEALLOCATE curDeleterProduits
72
73END
74GO
75SELECT * FROM TESTPRODUITS
76SELECT * FROM TESTEXEMPLAIRES
77INSERT INTO TESTEXEMPLAIRES
78VALUES ('TTT', 'C0002', '1', null, null, null, null, null, null, 10)
79--DELETE FROM TESTEXEMPLAIRES WHERE noclub = 'TTT';
80DELETE FROM TESTEXEMPLAIRES WHERE noproduit = 'C0004';
81SELECT * FROM TESTPRODUITS
82SELECT * FROM TESTEXEMPLAIRES
83
84/*
85Générer une erreur si la quantité en stock devient
86négative et annuler la transaction avec une erreur.
87*/