© Éditions Eyrolles
277
chapitre n° 7
Programmation avancée
Citons le travail de Roland Bouman, un Hollandais qui a écrit une fonction (UDF user-defined
function) en C, qui se comporte comme une fonction native (built-in) simulant le RAISE_
APPLICATION_ERROR. Cette fonction permet de retourner un message personnalisé à partir
du corps d’un déclencheur (http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errorsfrom-inside.html).
Tables mutantes
Alors qu’il n’est pas, en général, possible de manipuler la table sur laquelle se porte le déclencheur dans le corps du déclencheur lui-même, Oracle parle de mutating tables, et MySQL
permet d’accéder à la table en lecture. Si on tente d’y parvenir en mise à jour (INSERT,
UPDATE ou DELETE), l’erreur est « ERROR 1442 (HY000): Can't update table
'xxx' in stored function/trigger because it is already used by
statement which invoked this stored function/trigger ».
L’exemple suivant décrit la programmation d’un déclencheur qui compte les lignes d’une
table après chaque nouvelle insertion.
Tableau 7-29 Test du déclencheur BEFORE INSERT
Événement déclencheur
Résultat
--ajout incorrect
INSERT INTO Qualifications
VALUES
(
,'A380',:SYSDATE())$
ERROR 1048 (23000): Column 'col' cannot be null
-- ne fait pas l'INSERT dans Qualifications
-- ni dans Trace !
-- ajout correct
INSERT INTO Qualifications
VALUES
(
,'A380',SYSDATE())$
Query OK, 1 row affected (0.09 sec)
-- fait l'INSERT dans Qualifications et met à jour
-- la table Pilote (colonne nbQualif)
'PL-1'
'PL-3'
Tableau 7-30 Déclencheur (table mutante)
Déclencheur
Trace
SET @vs_nombre=0$
CREATE TRIGGER TrigMutant
AFTER INSERT ON Trace FOR EACH ROW
BEGIN
SELECT COUNT(*) INTO @vs_nombre
FROM Trace;
END;
$
SELECT @vs_nombre$
+------------+
| @vs_nombre |
+------------+
| 0
|
+------------+
INSERT INTO Trace
VALUES ('Test TrigMutant')$
SELECT @vs_nombre$
+------------+
| @vs_nombre |
+------------+
| 1
|
+------------+
Web
277
chapitre n° 7
Programmation avancée
Citons le travail de Roland Bouman, un Hollandais qui a écrit une fonction (UDF user-defined
function) en C, qui se comporte comme une fonction native (built-in) simulant le RAISE_
APPLICATION_ERROR. Cette fonction permet de retourner un message personnalisé à partir
du corps d’un déclencheur (http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errorsfrom-inside.html).
Tables mutantes
Alors qu’il n’est pas, en général, possible de manipuler la table sur laquelle se porte le déclencheur dans le corps du déclencheur lui-même, Oracle parle de mutating tables, et MySQL
permet d’accéder à la table en lecture. Si on tente d’y parvenir en mise à jour (INSERT,
UPDATE ou DELETE), l’erreur est « ERROR 1442 (HY000): Can't update table
'xxx' in stored function/trigger because it is already used by
statement which invoked this stored function/trigger ».
L’exemple suivant décrit la programmation d’un déclencheur qui compte les lignes d’une
table après chaque nouvelle insertion.
Tableau 7-29 Test du déclencheur BEFORE INSERT
Événement déclencheur
Résultat
--ajout incorrect
INSERT INTO Qualifications
VALUES
(
,'A380',:SYSDATE())$
ERROR 1048 (23000): Column 'col' cannot be null
-- ne fait pas l'INSERT dans Qualifications
-- ni dans Trace !
-- ajout correct
INSERT INTO Qualifications
VALUES
(
,'A380',SYSDATE())$
Query OK, 1 row affected (0.09 sec)
-- fait l'INSERT dans Qualifications et met à jour
-- la table Pilote (colonne nbQualif)
'PL-1'
'PL-3'
Tableau 7-30 Déclencheur (table mutante)
Déclencheur
Trace
SET @vs_nombre=0$
CREATE TRIGGER TrigMutant
AFTER INSERT ON Trace FOR EACH ROW
BEGIN
SELECT COUNT(*) INTO @vs_nombre
FROM Trace;
END;
$
SELECT @vs_nombre$
+------------+
| @vs_nombre |
+------------+
| 0
|
+------------+
INSERT INTO Trace
VALUES ('Test TrigMutant')$
SELECT @vs_nombre$
+------------+
| @vs_nombre |
+------------+
| 1
|
+------------+
Web
