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
相关产品推荐
相关产品推荐

