首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MySQL触发器中传递保存在日志表中的动态表名和列名

问如何在MySQL触发器中传递保存在日志表中的动态表名和列名
EN

Stack Overflow用户
提问于 2022-09-06 17:53:20
回答 1查看 24关注 0票数 0

如果在数据库表中更改了记录,我希望保留所有更改的记录。为此,我想输入表名、列名、旧值和新值.在日志表中,当通过触发器更改MYSQL表时。我的日志表看起来

​

​

EN

回答 1

Stack Overflow用户

发布于 2022-09-06 18:19:08

必须为特定表定义触发器,因此您已经知道要使用哪个表。然后,可以在编写触发器时将其指定为字符串文本。

代码语言:javascript
复制
CREATE TRIGGER t AFTER UPDATE ON MyTable
FOR EACH ROW BEGIN
  IF NEW.column1 <=> OLD.column1 THEN
    INSERT INTO Log 
    SET table_name='MyTable', -- string literal
        field_name='column1', -- string literal
        old_val=OLD.column1,
        new_val=NEW.coumn1,
        action='UPDATE'; -- string literal
  END IF;
  IF NEW.column2 <=> OLD.column2 THEN
    INSERT INTO Log 
    SET table_name='MyTable', -- string literal
        field_name='column2', -- string literal
        old_val=OLD.column2,
        new_val=NEW.coumn2,
        action='UPDATE' -- string literal;
  END IF;
END

您必须继续并为每个列添加另一个IF块。

如果更改表中的列,则必须重写触发器。

您可能会问,是否可以为循环中的每一列设置一个自动执行此操作的触发器。不你不能那样做。它需要准备/执行,但不能在触发器中使用动态SQL。

如果这似乎是很多工作,那么您可能需要考虑使用审计插件。您可以自己编写,也可以使用MySQL的开源审计插件之一,或者如果您是MySQL企业的客户,则提供面向付费客户的审计插件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73626037

复制
相关文章

相似问题

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