Bonjour,
Après avoir (un peu) parcouru le forum, j'ai quelques interrogations sur les triggers MySql (et SGBD en général, n'ayant pas effectué beaucoup de PL).
Ma problématique est la suivante :
j'ai une base de production ou certaines tables sont purgées manuellement du fait de leur taille qui pose problème au progiciel et certaines tables purgées automatiquement par le progiciel suivant l'avancement de l'état de la production (contexte industriel).
Aujourd'hui, nous souhaitons conserver un historique de ces tables dans une base d'historique pour des besoins statistiques ou bien pour vérifier les calculs d'optimisation fait par le progiciel (calculs effacés...).
Ma première idée est de créer des copies des tables concernées en les suffixant _his pour conserver les suppressions. Ces tables seraient stockées dans un autre schéma identique à celui de la base de production qui serait alimenté chaque nuit par les données de production. De cette manière, nous aurions les données de production et les suppressions agrégées par des union ou des vues.
Donc je pensais passer par un trigger on before delete. Ce trigger ferait un insert into table_his (select * from table where id=old.id)
Maintenant, j'ai pu lire par ici sur le forum :
"l'erreur signifie que vous ne pouvez pas faire une opération (insert, update ou delete) sur la même table que celle qui est utilisé par le déclencheur." Cela interdit également un select ?
D'autre part, j'ai aussi pu lire sur la documentation mysql que :
Si je comprends bien... Si mon insert sur la table d'historique échoue, l'instruction delete qui a déclenché le trigger ne sera pas exécuté et un rollback sera fait (quoi que on est sur on before donc pas de rollback à mon avis...?)MySQL handles errors during trigger execution as follows:
If a BEFORE trigger fails, the operation on the corresponding row is not performed.
A BEFORE trigger is activated by the attempt to insert or modify the row, regardless of whether the attempt subsequently succeeds.
An AFTER trigger is executed only if any BEFORE triggers and the row operation execute successfully.
An error during either a BEFORE or AFTER trigger results in failure of the entire statement that caused trigger invocation.
For transactional tables, failure of a statement should cause rollback of all changes performed by the statement. Failure of a trigger causes the statement to fail, so trigger failure also causes rollback. For nontransactional tables, such rollback cannot be done, so although the statement fails, any changes performed prior to the point of the error remain in effect.
Autant sur les suppressions manuelles cela ne me pose pas trop de souci, au pire je relance le delete après controle, autant sur celles effectuées par le progiciel, c'est un peu plus problématique.
Comment être sur que l'instruction delete sera exécutée même si le bloc pl du trigger échoue ?
Merci d'avance pour votre lecture et vos réponses.
Partager