mysql查所有触发器必须先use数据库,否则show triggers报error 1046;跨库用show triggers from db_name;完整定义需查information_schema.triggers或show create trigger。

MySQL 查所有触发器必须先 USE 数据库
不指定数据库就执行 SHOW TRIGGERS,必然报错 ERROR 1046 (3D000): No database selected。这不是权限问题,是语法强制要求。
- 正确做法:先
USE your_db_name;,再运行SHOW TRIGGERS; - 想查其他库?用
SHOW TRIGGERS FROM other_db;,FROM后直接跟库名,不用加引号 -
SHOW TRIGGERS的Statement列默认只显示前 64 字符,逻辑被截断——别靠它判断触发器干了啥 - 如果结果为空,先确认当前用户对该库有
TRIGGER权限,否则静默不返回任何记录
MySQL 拿完整定义只能查 INFORMATION_SCHEMA.TRIGGERS
SHOW CREATE TRIGGER 虽能输出可执行语句,但必须知道精确的触发器名和库名;批量查定义唯一可靠方式是查系统表。
- 查当前库全部触发器定义:
SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE, EVENT_MANIPULATION, ACTION_TIMING, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = DATABASE(); -
ACTION_STATEMENT是原始 SQL 主体(不含CREATE TRIGGER ... ON ... FOR EACH ROW头部),含换行和空格,复制后可能需手动清理缩进 - 字段
DEFINER和SQL_MODE也在这里,迁移或复现时容易漏掉 - 没权限的触发器不会出现在结果里,不是 bug,是视图本身的权限过滤机制
SQL Server 查触发器得连 sys.triggers 和 sys.sql_modules
单独查 sys.triggers 只能看到名字、状态、绑定表,看不到代码;定义藏在 sys.sql_modules 里,漏 JOIN 就等于白查。
- 查带定义的触发器:
SELECT t.name, t.is_disabled, m.definition FROM sys.triggers t JOIN sys.sql_modules m ON t.object_id = m.object_id; - 查某张表的触发器:
WHERE t.parent_id = OBJECT_ID('your_table'),注意传入格式如'dbo.Customers' -
is_disabled字段常被忽略,线上行为异常十有八九是触发器被悄悄禁用了 - 别用
OBJECT_DEFINITION(object_id)替代sys.sql_modules,加密对象会返回 NULL
PostgreSQL 触发器逻辑不在 pg_trigger 表里
pg_trigger 只存调用关系,函数体在 pg_proc;只查前者,等于只看到“按钮”,不知道“按下去干啥”。
- 查触发器+对应函数名:
SELECT tgname, tgwhen, tgtype, tgfoid::regproc FROM pg_trigger t JOIN pg_class c ON t.tgrelid = c.oid WHERE c.relname = 'your_table'; - 查函数体:
SELECT pg_get_functiondef(oid) FROM pg_proc WHERE oid IN (SELECT tgfoid FROM pg_trigger WHERE tgrelid = 'your_table'::regclass); -
tgtype是位掩码,比如判断是否为 INSERT 触发器得用tgtype & 2 = 2,不能直接比数值 - 函数里可能调用其他函数或外部扩展,单看触发器元数据根本没法还原完整行为











