在 TRIGGER 中使用 INFORMATION_SCHEMA.COLUMNS 来记录对 _all_ 列的更改?
using INFORMATION_SCHEMA.COLUMNS in a TRIGGER to log changes to _all_ columns?
TRIGGER 可用于记录对单个数据库列的更改,如 中所述,但该技术要求您对每个列都有一个 IF 语句。如果您只对 one 列的更改感兴趣,这不是一个大问题,但是如果您对 all 列的更改感兴趣,它就变成了有点笨拙。
我可以通过查询 INFORMATION_SCHEMA.COLUMNS table 动态获取 table 的所有列名。我的问题是......我可以用它来动态引用列名吗?就像在 TRIGGER 中你会做的那样 OLD.columnName <> NEW.columnName
但我不认为你真的可以像那样使列名动态化。
在PHP中你可以使用可变变量。例如。 $obj->$var
。但是,如果 MySQL 有任何类似的东西,那对我来说就是新闻了。
有什么想法吗?还是我将采用老式的方法为 table 的 100 多列中的每一列编写一个 IF 语句?
触发器只能直接引用标识符。您不能使用变量或表达式来命名标识符。
这将需要具有 PREPARE 和 EXECUTE 的动态 SQL,因此您可以在运行时从字符串中解析语句,但您不能在触发器内准备新语句,因为触发器已经在执行在当前执行语句的上下文中。
最简单的解决方案是编写一个直接引用每一列的触发器,使用与 table 中的列一样多的 IF
语句(我想知道为什么你的中有数百列table;这听起来像是糟糕设计的另一个问题)。
上面的评论提到了一个二进制日志解析器。 Debezium 是开源二进制日志解析器的示例。
MySQL 也支持 audit plugin architecture,但坦率地说,现有的审计插件实现非常笨拙。
TRIGGER 可用于记录对单个数据库列的更改,如 中所述,但该技术要求您对每个列都有一个 IF 语句。如果您只对 one 列的更改感兴趣,这不是一个大问题,但是如果您对 all 列的更改感兴趣,它就变成了有点笨拙。
我可以通过查询 INFORMATION_SCHEMA.COLUMNS table 动态获取 table 的所有列名。我的问题是......我可以用它来动态引用列名吗?就像在 TRIGGER 中你会做的那样 OLD.columnName <> NEW.columnName
但我不认为你真的可以像那样使列名动态化。
在PHP中你可以使用可变变量。例如。 $obj->$var
。但是,如果 MySQL 有任何类似的东西,那对我来说就是新闻了。
有什么想法吗?还是我将采用老式的方法为 table 的 100 多列中的每一列编写一个 IF 语句?
触发器只能直接引用标识符。您不能使用变量或表达式来命名标识符。
这将需要具有 PREPARE 和 EXECUTE 的动态 SQL,因此您可以在运行时从字符串中解析语句,但您不能在触发器内准备新语句,因为触发器已经在执行在当前执行语句的上下文中。
最简单的解决方案是编写一个直接引用每一列的触发器,使用与 table 中的列一样多的 IF
语句(我想知道为什么你的中有数百列table;这听起来像是糟糕设计的另一个问题)。
上面的评论提到了一个二进制日志解析器。 Debezium 是开源二进制日志解析器的示例。
MySQL 也支持 audit plugin architecture,但坦率地说,现有的审计插件实现非常笨拙。