在 MySQL 中创建触发器以记录数据库中的更改

Posted

技术标签:

【中文标题】在 MySQL 中创建触发器以记录数据库中的更改【英文标题】:Create trigger in MySQL to log changes in database 【发布时间】:2020-01-28 17:04:39 【问题描述】:

更新!

分隔符的东西实际上解决了我原来的问题。但我现在遇到了一个新的错误。我将在下面描述它以及解决第一个问题的实现更改。

我正在尝试编写一个触发器,它将数据库中的更改记录到一个单独的表中。但我不断收到同样的错误。我查看了 mysql 文档并搜索了这个论坛,发现了很多有用的答案。问题是我现在有一段 SQL 代码看起来与这个论坛中给出的答案完全一样,但我仍然收到错误。

我尝试使用的触发器是:

CREATE TRIGGER logInsert AFTER INSERT ON test_table
    FOR EACH ROW
    BEGIN
      INSERT INTO datalog (action, id, timestamp, data1, data2)
      VALUES ('insert', NEW.id, NOW(), NEW.data1, NEW.data2);
    END;

我得到的错误信息是:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5

我尝试使用 " 而不是单引号。 有人在这里涌现出你应该使用反引号的答案,所以也尝试过。 无论如何,错误信息都是一样的。

这里有一个友好的灵魂为我最初的错误发布了一个修复程序。我需要在语句中添加 DELIMITER,使其看起来像这样:

DELIMITER $$
CREATE TRIGGER logInsert AFTER INSERT ON test_table
    FOR EACH ROW
    BEGIN
      INSERT INTO datalog (action, id, timestamp, data1, data2)
      VALUES ('insert', NEW.id, NOW(), NEW.data1, NEW.data2);
    END$$
DELIMITER ;

这个改变解决了原来的错误,但也让一个新的错误。 新的错误是: Unknown Coloumn 'id' in table NEW

这是我要写入的表:

CREATE TABLE datalog (
      id   INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
      timestamp   TIMESTAMP,
      data1 VARCHAR(255) NOT NULL,
      data2  DECIMAL(5,2) NOT NULL 
);

希望这里有人知道出了什么问题。

亲切的问候, 乔纳斯

【问题讨论】:

如果你的触发器/函数/过程有多个语句,或者使用BEGIN END;您需要覆盖DELIMITER,因此解析器不会假定您在第一次遇到分号时尝试结束定义。通常,DELIMITER $$ 后跟 def 以 END$$ 终止,然后是 DELIMITER ; 以恢复正常。 谢谢。解决了部分问题,现在我遇到了一个新错误。 【参考方案1】:

对触发器使用 DELIMITER 喜欢

DELIMITER $$
CREATE TRIGGER logInsert AFTER INSERT ON test_table
FOR EACH ROW
BEGIN
  INSERT INTO datalog (action, id, timestamp, data1, data2)
  VALUES ('insert', NEW.id, NOW(), NEW.data1, NEW.data2);
END$$
DELIMITER ;

【讨论】:

太好了,谢谢。这实际上是我第一次遇到不同的错误。现在我收到错误“未知列 'id' i tabel NEW 那么你的test_table没有id列

以上是关于在 MySQL 中创建触发器以记录数据库中的更改的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中创建审核触发器

H2 - 如何创建将行更改记录到另一个表的数据库触发器?

使用 Where 子句在 MySql 中创建触发器

SQL Server 触发器触发 3 次

怎么在Dbeaver中创建mysql 触发器

我可以在 rds 数据库中创建触发器吗?