触发仅对查询执行一次后台操作

时间:2018-02-15 10:54:09

标签: mysql sql database-trigger

给出示例触发器:

CREATE TRIGGER example BEFORE UPDATE ON example_table FOR EACH ROW <DO STUFF>;

如果我正确理解了触发器的mysql文档,则会针对受影响的每一行调用触发器。因此,如果我在example_table上运行更新查询WHERE子句匹配多行,则会多次调用触发器并多次执行<DO STUFF>。但是,如果我只想在表上对每个更新查询执行一个操作(例如,基本操作日志记录),则这很不方便。

是否有触发器(等效物)允许我对表格上的每个查询执行一次操作?

一个澄清的例子:

想要的触发器:

CREATE TRIGGER example BEFORE UPDATE ON example_table DO ONCE INSERT INTO logging_table (time, table, action) VALUES (timestamp(), 'example_table', 'UPDATE');

example_table:

 id | name 
---------------
 1  | "George"
 2  | "Gina"
 3  | "Garfield"

触及example_table中的多个元素的查询:

UPDATE example_table WHERE id < 4 SET name = "NO ONE"

生成的日志记录表

     time       |     table     | action
------------------------------------------
20180215 114244 | example_table | UPDATE

请不要关注示例,而应关注示例的预期效果,因为示例是展示的简化。因此,允许示例工作但不能扩展到任何其他任意操作的黑客不能回答我的问题.a

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找语句级触发器。不幸的是,mysql中没有语句级触发器。

检查以下内容:MySQL Trigger get current query that caused trigger to fire

https://dev.mysql.com/doc/refman/5.7/en/faqs-triggers.html#faq-mysql-have-trigger-levels

“在MySQL 5.7中,所有触发器都是FOR EACH ROW;也就是说,为插入,更新或删除的每一行激活触发器.MySQL 5.7不支持使用FOR EACH STATEMENT的触发器。”