我正在尝试设置一系列历史触发器,以便通过触发器自动收集给定表的历史记录。我想使用触发器,因为这可以保证我捕获所有更改,无论是否有人忘记将其保存在应用程序中。我的问题是我有这个触发器。
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
//这会将payments中的所有内容都填充到payments_history中,并填充执行的操作、操作发生的日期/时间、导致执行操作的MySQL用户。我的应用程序中的每个用户都有一个我想要保存的USER_ID (来自users表)。对于更新,这不是问题,因为USER_ID是update查询中使用的一个字段。但是,在delete中没有传入数据,因此NEW是不可访问的,因为那里什么都没有。除了执行第二次查询来更新记录之外,我想不出一个好方法来让USER_ID在删除时保存到历史表中。我不想使用这种解决方案,因为在delete之后,其他人可能会忘记调用该方法来更新记录,从而导致数据丢失。
发布于 2009-09-03 16:23:04
将会话变量设置为user_id,如果user_id会话变量中没有值user_id,则让触发器中止删除。
在MySQL会话中设置user_id的查询:
SET @user_id = <value of user_id>新删除:
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
//https://stackoverflow.com/questions/1374383
复制相似问题