Bonsoir escartefigue,
Je n'ai pas encore étudié la notion de trigger, il va falloir que je me documente avant de le créer.
D'accord pour la cardinalité de PARAITRE DANS côté ouvrage, ci-dessous mon MCD mis à jour en conséquence.
Bonsoir escartefigue,
Je n'ai pas encore étudié la notion de trigger, il va falloir que je me documente avant de le créer.
D'accord pour la cardinalité de PARAITRE DANS côté ouvrage, ci-dessous mon MCD mis à jour en conséquence.
Bonjour à tous,
Voici ci-dessous les triggers que j'ai écrits pour gérer les insertions, suppressions et mises à jour dans les tables PARAITRE DANS et EDITION (qui interviennent dans l'inclusion).
Est-il possible de les écrire de manière plus concise (j'ai lu qu'on ne pouvait associer qu'un événement par moment) ?
Sinon je ne les ai pas encore tous testés, j'espère que c'est correct.
Code SQL : 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 /* Code du trigger "Avant insertion dans PARAITRE DANS" */ DELIMITER | DROP TRIGGER IF EXISTS INS_PARAITRE_DANS ; CREATE TRIGGER INS_PARAITRE_DANS BEFORE INSERT ON PARAITRE_DANS FOR EACH ROW BEGIN DECLARE nb INTEGER; SELECT COUNT(*) INTO nb FROM EDITION WHERE id_ouvrage = NEW.id_ouvrage AND id_editeur = NEW.id_editeur ; IF (nb = 0) THEN SIGNAL SQLSTATE "45000" SET MESSAGE_TEXT = "operation impossible, vous ne pouvez pas inserer les id dans PARAITRE_DANS alors qu'ils n'existent pas dans EDITION !" ; END IF; END | DELIMITER ; /* Code du trigger "Avant suppression dans EDITION" */ DELIMITER | DROP TRIGGER IF EXISTS DEL_EDITION_DANS ; CREATE TRIGGER DEL_EDITION_DANS BEFORE DELETE ON EDITION FOR EACH ROW BEGIN DECLARE nb INTEGER; SELECT COUNT(*) INTO nb FROM PARAITRE_DANS WHERE id_ouvrage = OLD.id_ouvrage AND id_editeur = OLD.id_editeur ; IF (nb = 1) THEN SIGNAL SQLSTATE "45000" SET MESSAGE_TEXT = "operation impossible, vous ne pouvez pas supprimer les id dans EDITION alors qu'ils existent dans PARAITRE_DANS !" ; END IF; END | DELIMITER ; /* Code du trigger "Avant mise à jour dans PARAITRE DANS" */ DELIMITER | DROP TRIGGER IF EXISTS UPD_PARAITRE_DANS ; CREATE TRIGGER UPD_PARAITRE_DANS BEFORE UPDATE ON PARAITRE_DANS FOR EACH ROW BEGIN DECLARE nb INTEGER; SELECT COUNT(*) INTO nb FROM EDITION WHERE id_ouvrage = NEW.id_ouvrage AND id_editeur = NEW.id_editeur ; IF (nb = 0) THEN SIGNAL SQLSTATE "45000" SET MESSAGE_TEXT = "operation impossible, vous ne pouvez pas mettre a jour les id dans PARAITRE_DANS alors qu'ils n'existent pas dans EDITION !" ; END IF; END | DELIMITER ; /* Code du trigger "Avant mise à jour dans EDITION" */ DELIMITER | DROP TRIGGER IF EXISTS UPD_EDITION_DANS ; CREATE TRIGGER UPD_EDITION_DANS BEFORE UPDATE ON EDITION FOR EACH ROW BEGIN DECLARE nb INTEGER; SELECT COUNT(*) INTO nb FROM PARAITRE_DANS WHERE id_ouvrage = OLD.id_ouvrage AND id_editeur = OLD.id_editeur ; IF (nb = 1) THEN SIGNAL SQLSTATE "45000" SET MESSAGE_TEXT = "operation impossible, vous ne pouvez pas mettre a jour les id dans EDITION alors qu'ils existent dans PARAITRE_DANS !" ; END IF; END | DELIMITER ;
Merci
Ça me semble OK, mais pour un test d'existence, il est préférable d'utiliser EXISTS plutôt qu'un comptage.
Même si ici, la différence de performances devrait être minime, dans l'absolu, EXISTS s'arrête dès la première occurrence trouvée alors que COUNT comptera toutes les occurrences
Pour plus de détails sur la mise en oeuvre des triggers, il est préférable de poster dans le forum consacré au SGBD choisi
Les forums qui concernent les différents SGBD-R se trouvent ici :
https://www.developpez.net/forums/f4/bases-donnees/
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