Si j'ai un trigger
before the update
sur une table, comment puis-je lancer une erreur qui empêche la mise à jour de cette table?
174
Voici un hack qui peut fonctionner. Ce n'est pas propre, mais il semble que cela pourrait fonctionner:
Essentiellement, vous essayez simplement de mettre à jour une colonne qui n'existe pas.
Depuis MySQL 5.5, vous pouvez utiliser la
SIGNAL
syntaxe pour lever une exception :L'état 45000 est un état générique représentant une «exception définie par l'utilisateur non gérée».
Voici un exemple plus complet de l'approche:
la source
Malheureusement, la réponse fournie par @RuiDC ne fonctionne pas dans les versions MySQL antérieures à 5.5 car il n'y a pas d'implémentation de SIGNAL pour les procédures stockées.
La solution que j'ai trouvée est de simuler un signal générant une
table_name doesn't exist
erreur, en poussant un message d'erreur personnalisé dans le fichiertable_name
.Le piratage peut être implémenté à l'aide de déclencheurs ou à l'aide d'une procédure stockée. Je décris les deux options ci-dessous en suivant l'exemple utilisé par @RuiDC.
Utiliser des déclencheurs
Utilisation d'une procédure stockée
Les procédures stockées vous permettent d'utiliser SQL dynamique, ce qui rend possible l'encapsulation de la fonctionnalité de génération d'erreurs en une seule procédure. Le contrepoint est que nous devons contrôler les méthodes d'insertion / mise à jour des applications, afin qu'elles utilisent uniquement notre procédure stockée (n'accordant pas de privilèges directs à INSERT / UPDATE).
la source
La procédure suivante est (sur mysql5) un moyen de lancer des erreurs personnalisées et de les consigner en même temps:
la source
la source
Une autre méthode (hack) (si vous n'êtes pas sur 5.5+ pour une raison quelconque) que vous pouvez utiliser:
Si vous avez un champ obligatoire, dans un déclencheur, définissez le champ requis sur une valeur non valide telle que NULL. Cela fonctionnera à la fois pour INSERT et UPDATE. Notez que si NULL est une valeur valide pour le champ obligatoire (pour une raison folle), cette approche ne fonctionnera pas.
Si vous êtes sur 5.5+, vous pouvez utiliser l'état du signal comme décrit dans d'autres réponses:
la source
la source