要使用触发器记录对表的所有更改,事件需要在之前或之后

时间:2017-04-08 19:10:06

标签: mysql triggers delimiter

这是一个名为user_log的表:

CREATE TABLE user_log (
  id INT(10) UNSIGNED PRIMARY KEY auto_increment,
  user_id INT (10),
  name VARCHAR (50),
  username VARCHAR (32),
  password VARCHAR (32),
  email VARCHAR(255) NOT NULL,
  user_type_id INT (11),
  created DATETIME NOT NULL
  );

创建一个触发器,将对users表的所有更改记录到上面的user_log表中。它应该将OLD值插入日志表中。

这就是我所拥有的:

DELIMITER $$
CREATE TRIGGER changes_log AFTER UPDATE ON user_log 
FOR EACH ROW
BEGIN
    IF (OLD.user_id != NEW.user_id) THEN
        INSERT INTO user_log (id, name, username, password, email,
        user_type_id, created)
    VALUES(OLD.id, OLD.name, OLD.username, OLD.password, OLD.email,
    OLD.user_type_id, OLD.created, NOW(), 'Entry Updated');
    END IF;
END$$

这是否实现了一个成功的触发器,它会将对users表的所有更改记录到我在上面创建的user_log表中?

1 个答案:

答案 0 :(得分:0)

我建议使用AFTER触发器。在users表中成功更新后,AFTER触发器将运行。如果出现阻止更新成功的错误(例如违反约束或类似内容),则不会有任何更改,因此无需记录。

我注意到,只有当用户ID发生变化时才会触发逻辑记录更改,因为这行:

IF (OLD.user_id != NEW.user_id) THEN

但是,如果任何其他列发生变化会怎么样?例如,如果用户的电子邮件发生更改,您是否不想记录更改?