【问题标题】:Which tables were affected during single query run by triggers cascade在触发器级联运行的单个查询期间哪些表受到影响
【发布时间】:2014-06-25 14:37:20
【问题描述】:

MySQL Performance Blog 称,昨天(5 月 6 日)宣布的新 Percona 服务器都包含 MySQL 审计插件的开源版本。

我要完成的任务是:在单个更新查询运行期间记录受级联触发器执行影响的表。例如。当UPDATE MY_TABLE …被执行时,触发器{BEFORE,AFTER}_UPDATE可能会更新其他表,这些表上可能有自己的触发器等。

目前我使用国内的解决方案;在 all 触发器中,我放了 smth 之类的:

IF (
        SELECT count(*) 
        FROM  `information_schema`.`ROUTINES` 
        WHERE  specific_name = 'my_own_log' 
          AND  routine_schema = 'my_schema'
) > 0 THEN
    CALL my_own_log ('FOO_TRIGGER', 'Hi, I’m to update MY_TABLE') ;
END IF ;

在生产中,我没有定义 my_own_log 过程,并且由于 information_schema 表已经过优化,我不会产生任何性能损失。

问题是我是否可以切换到企业解决方案(上述audit 插件)以获取有关哪些表受到级联触发器执行影响的信息。 JFYI:我发现的唯一类似问题 here 没有提供适用的答案。

感谢您的任何建议。

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    插件审核旨在注册与服务器的外部交互,用于跟踪入侵和其他相关活动,而不是服务器与其自身的交互(如触发器和过程)。

    这些内部活动不会根据设计对任何审计插件生成操作。来自开发者博客:


    http://dev.mysql.com/doc/refman/5.6/en/audit-log-plugin-logging-control.html

    每当发生可审计事件时,例如当它完成从客户端接收到的 SQL 语句的执行时,MySQL 服务器都会调用审计日志插件来写入元素。通常,服务器启动后编写的第一个元素具有服务器描述和启动选项。其后的元素表示诸如客户端连接和断开连接事件、执行的 SQL 语句等事件。 只记录顶级语句,不记录存储程序(如触发器或存储过程)中的语句。 不记录被 LOAD DATA INFILE 等语句引用的文件的内容。


    目前,您最好使用自己的解决方案。您可以尝试提高其性能,以便在生产环境中启用它。

    【讨论】:

    • 也许这些轮子还没有被发明出来。你的要求很不寻常。您会看到,鉴于触发器和 FK 已经存在,您应该能够在执行任何查询之前通过静态分析来判断它的操作,除非您使用某种概率的操作路线来定义您的结果。因此,事先不知道 DML 语句的作用是非常不寻常的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多