2009-09-03 7 views
0

J'essaie de configurer une série de déclencheurs d'historique pour collecter automatiquement l'historique d'une table donnée via des déclencheurs. Je veux utiliser des déclencheurs car cela garantit que je capture tous les changements, même si quelqu'un oublie de le sauvegarder dans l'application. Mon problème est que j'ai ce déclencheur.Enregistrement du USER_ID d'un utilisateur ayant supprimé un enregistrement avec un déclencheur dans MySQL

CREATE TRIGGER `db`.`delete_history_trigger` BEFORE DELETE ON `db`.`payments` 
    FOR EACH ROW BEGIN 
      INSERT INTO `payments_history` select *, 'delete', NOW(), USER() from `payments` where `PAYMENT_ID` = OLD.`PAYMENT_ID`; 
    END 
// 

Cette fois, tout en substance dans paymentspayments_history et remplit l'action qui a été effectuée, la date/heure de l'action a eu lieu, l'utilisateur MySQL qui a causé l'action à effectuer. Chaque utilisateur de mon application dispose d'un USER_ID (qui provient du tableau users) que je souhaite enregistrer. Pour les mises à jour, ce n'est pas un problème car USER_ID est un des champs utilisés dans la requête update. Cependant, dans delete il n'y a pas de données transmises et donc NEW n'est pas accessible car il n'y a rien là. Je ne peux pas penser à un bon moyen d'obtenir le USER_ID à enregistrer dans la table d'historique sur les suppressions à court de faire une deuxième requête pour mettre à jour l'enregistrement. Je préfère ne pas utiliser cette solution car il est possible que quelqu'un d'autre oublie d'appeler la méthode pour mettre à jour l'enregistrement après une suppression et que les données seraient perdues.

Répondre

1

Définissez une variable de session sur id_utilisateur et faites en sorte que le déclencheur interrompe la suppression si la variable de session user_id n'a pas de valeur user_id.

requête pour définir user_id en session MySQL:

SET @user_id = <value of user_id> 

Nouvelle supprimer:

CREATE TRIGGER `db`.`delete_history_trigger` BEFORE DELETE ON `db`.`payments` 
    FOR EACH ROW BEGIN 
     INSERT INTO `payments_history` select *, 'delete', NOW(), USER(), @user_id from `payments` where `PAYMENT_ID` = OLD.`PAYMENT_ID`; 
    END 
// 
+0

Ainsi comme, SET @USER_ID = ? – baudtack

Questions connexes