You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 5.7中如何获取触发器关联的表名?

MySQL 5.7触发器中动态获取关联表名的方案

MySQL 5.7没有像SQL Server那样直接提供内置变量获取触发器关联的表名,但可以通过两种方案实现动态、可移植的审计日志需求:

方案一:通过系统表查询获取表名

利用MySQL的information_schema.TRIGGERS系统表,结合内置函数TRIGGER_NAME()获取当前触发器名称,进而关联到对应的表名。这种方案无需硬编码,复制到其他表的触发器时无需修改内部逻辑。

修改后的触发器核心代码:

BEGIN
    -- 从系统表查询当前触发器关联的表名
    SELECT EVENT_OBJECT_TABLE INTO @table_name
    FROM information_schema.TRIGGERS
    WHERE TRIGGER_SCHEMA = DATABASE()
      AND TRIGGER_NAME = TRIGGER_NAME();

    INSERT INTO `test`.`audit_table1` 
        (`serialNumber`, `auditTrailTableName`, `action`, `communicationDate`) 
    VALUES (OLD.id, @table_name, NEW.type, NEW.createdOn);
END

注意事项:

  • 确保触发器所属数据库用户拥有SELECT权限访问information_schema.TRIGGERS表
  • TRIGGER_NAME()是MySQL 5.7内置函数,可直接返回当前执行的触发器名称
  • 若触发器执行频率极高,查询系统表可能带来轻微性能损耗,可考虑方案二

方案二:通用模板+批量替换表名

如果担心系统表查询的性能,可编写通用触发器模板,通过占位符标记表名,复制到其他表时仅替换占位符即可,兼顾可移植性与性能。

通用模板代码:

-- 复制时将{TABLE_NAME}替换为实际表名(如user、order等)
BEGIN
    SET @table_name = '{TABLE_NAME}';

    INSERT INTO `test`.`audit_table1` 
        (`serialNumber`, `auditTrailTableName`, `action`, `communicationDate`) 
    VALUES (OLD.id, @table_name, NEW.type, NEW.createdOn);
END

内容的提问来源于stack exchange,提问作者kasdega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:45:41