Considérez ce déclencheur :
ALTER TRIGGER myTrigger
ON someTable
AFTER INSERT
AS BEGIN
DELETE FROM someTable
WHERE ISNUMERIC(someField) = 1
END
J'ai une table, someTable, et j'essaie d'empêcher les gens d'insérer de mauvais enregistrements. Pour les besoins de cette question, un mauvais enregistrement a un champ "someField" qui est entièrement numérique.
Bien sûr, la bonne façon de faire cela n'est PAS avec un trigger, mais je ne contrôle pas le code source... juste la base de données SQL. Je ne peux donc pas vraiment empêcher l'insertion de la mauvaise ligne, mais je peux la supprimer immédiatement, ce qui est suffisant pour mes besoins.
Le déclencheur fonctionne, avec un problème... quand il se déclenche, il ne semble jamais supprimer l'enregistrement défectueux qui vient d'être inséré... il supprime tous les ANCIENS enregistrements défectueux, mais pas l'enregistrement défectueux qui vient d'être inséré. Il y a donc souvent un mauvais enregistrement qui flotte et qui n'est pas supprimé jusqu'à ce que quelqu'un d'autre vienne faire un autre INSERT.
S'agit-il d'un problème dans ma compréhension des déclencheurs ? Les lignes nouvellement insérées ne sont-elles pas encore validées pendant l'exécution du déclencheur ?
0 votes
La transaction n'est pas encore validée (c'est pourquoi vous pouvez faire un retour en arrière, ce qui est probablement la meilleure solution), mais vous pouvez mettre à jour/supprimer les lignes puisque le déclencheur se trouve dans la même transaction que l'instruction INSERT.