MySQL中查看已创建触发器最直接方式是查询information_schema.TRIGGERS表,需指定WHERE TRIGGER_SCHEMA='db_name'条件;TRIGGER_NAME、EVENT_MANIPULATION、ACTION_TIMING和ACTION_STATEMENT字段分别存储名称、事件类型、触发时机及完整定义。

MySQL 中查看已创建的触发器
MySQL 提供了专门的系统表和命令来查触发器,最直接的方式是查询 information_schema.TRIGGERS 表。它包含所有数据库中触发器的定义、事件类型、触发时机等关键信息。
- 必须指定
TRIGGER_SCHEMA条件,否则可能返回空或跨库混乱结果;常见错误是漏写WHERE TRIGGER_SCHEMA = 'your_db_name' - 触发器名在
TRIGGER_NAME字段,触发事件(如INSERT、UPDATE)在EVENT_MANIPULATION,执行时机(BEFORE/AFTER)在EVENT_MANIPULATION - 完整定义(含 SQL 逻辑)存在
ACTION_STATEMENT字段,但会被截断(默认最多 65535 字符),大触发器建议用SHOW CREATE TRIGGER trigger_name查看原生建模语句
示例:
SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_TIMING, ACTION_STATEMENT FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'myapp_db';
SQL Server 中列出触发器及其所属对象
SQL Server 的触发器分两类:DML 触发器(绑定到表/视图)和 DDL 触发器(响应 CREATE/ALTER/DROP)。它们不共用同一张系统视图,需分别处理。
- 查表级 DML 触发器用
sys.triggers+sys.tables关联,注意parent_id指向object_id,不是表名字符串 - DDL 触发器的
is_ms_shipped = 0必须过滤,否则混入系统内置触发器(如 Service Broker 相关) -
OBJECT_DEFINITION(object_id)可提取触发器源码,但返回nvarchar(max),直接 SELECT 可能被 SSMS 截断,建议用PRINT或复制到编辑器查看
示例(DML 触发器):
SELECT t.name AS trigger_name,
OBJECT_NAME(t.parent_id) AS target_object,
t.is_disabled,
t.create_date
FROM sys.triggers t
INNER JOIN sys.tables tbl ON t.parent_id = tbl.object_id
WHERE t.is_ms_shipped = 0;
PostgreSQL 中检查触发器及关联函数
PostgreSQL 把触发器和触发器函数分开存储,只查 pg_trigger 看不到逻辑内容,必须连查 pg_proc 才能还原完整行为。
-
pg_trigger.tgfoid对应pg_proc.oid,即触发器调用的函数 OID;漏掉这步就只能看到“调用了某个函数”,不知道函数干了啥 -
pg_trigger.tgconstraint = 0表示普通触发器;若为非零值,则是约束触发器(由CHECK、FOREIGN KEY等隐式创建),通常无需手动干预 - 触发器启用状态藏在
tgenabled字段:O(originally enabled)、D(disabled)、A(always,仅适用于 session-level triggers)
示例:
SELECT tgname AS trigger_name,
relname AS on_table,
proname AS function_name,
tgtype::bit(4) AS trigger_type_bits,
tgenabled
FROM pg_trigger
JOIN pg_class ON tgrelid = pg_class.oid
JOIN pg_proc ON tgfoid = pg_proc.oid
WHERE NOT tgisinternal;
触发器查询结果不可靠的常见原因
不是所有触发器都会出现在标准系统视图里——权限、模式隔离、临时对象这些细节很容易被忽略。
- 当前用户缺少对
information_schema或sys视图的SELECT权限时,查询会返回空而不是报错,尤其在生产库受限账号下极易误判“没有触发器” - PostgreSQL 中若触发器定义在非
publicschema,而查询没加pg_namespace关联,relname会显示为数字 OID 而非真实表名 - SQL Server 的 tempdb 中创建的触发器不会出现在
sys.triggers(除非显式指定tempdb.sys.triggers),但这类触发器极少见,一般只用于调试场景
真正要确认一个库有没有触发器,不能只靠一次查询;得结合权限验证、schema 显式限定、以及必要时用 DBA 账号交叉比对。

















