首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存在MySQL中使用触发器删除记录的用户的USER_ID

问保存在MySQL中使用触发器删除记录的用户的USER_ID
EN

Stack Overflow用户
提问于 2009-09-03 16:08:37
回答 1查看 3.4K关注 0票数 1

我正在尝试设置一系列历史触发器,以便通过触发器自动收集给定表的历史记录。我想使用触发器,因为这可以保证我捕获所有更改,无论是否有人忘记将其保存在应用程序中。我的问题是我有这个触发器。

代码语言:javascript
复制
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之后,其他人可能会忘记调用该方法来更新记录,从而导致数据丢失。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-09-03 16:23:04

将会话变量设置为user_id,如果user_id会话变量中没有值user_id,则让触发器中止删除。

在MySQL会话中设置user_id的查询:

代码语言:javascript
复制
SET @user_id = <value of user_id>

新删除:

代码语言:javascript
复制
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
//
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1374383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档