获取触发器更新的列列表:Firebird触发器关联列查询问题
获取Firebird触发器更新的表列信息
你当前的查询仅能获取触发器的基本信息(包括关联表名),要拿到触发器实际更新的表列,需要关联Firebird的其他系统表,核心是RDB$TRIGGER_FIELDS——它存储了触发器与表列的关联关系。
基础查询:获取触发器指定更新的列
使用以下SQL可以直接关联触发器、表和对应的更新列:
SELECT t.RDB$TRIGGER_NAME AS 触发器名称, r.RDB$RELATION_NAME AS 关联表名, rf.RDB$FIELD_NAME AS 更新列名, CASE rf.RDB$UPDATE_FLAG WHEN 1 THEN '允许更新' ELSE '不允许更新' END AS 更新权限 FROM RDB$TRIGGERS t JOIN RDB$TRIGGER_FIELDS rf ON t.RDB$TRIGGER_NAME = rf.RDB$TRIGGER_NAME JOIN RDB$RELATIONS r ON t.RDB$RELATION_NAME = r.RDB$RELATION_NAME WHERE t.RDB$SYSTEM_FLAG = 0 ORDER BY t.RDB$TRIGGER_NAME, r.RDB$RELATION_NAME, rf.RDB$FIELD_NAME;
各系统表作用说明
RDB$TRIGGERS:存储所有触发器的元数据,RDB$SYSTEM_FLAG=0过滤出用户自定义的触发器(排除系统内置触发器)。RDB$TRIGGER_FIELDS:记录触发器关联的具体表列,RDB$UPDATE_FLAG标记该列是否允许被触发器更新。RDB$RELATIONS:通过关联获取触发器所属表的名称(也可直接用t.RDB$RELATION_NAME,关联此表是为了确保表存在且获取完整表信息)。
进阶查询:覆盖全表更新的触发器
如果触发器是针对整个表操作(未指定具体列),RDB$TRIGGER_FIELDS中不会有对应记录,此时可以通过关联RDB$RELATION_FIELDS获取该表的所有列:
WITH TriggerTables AS ( SELECT RDB$TRIGGER_NAME, RDB$RELATION_NAME FROM RDB$TRIGGERS WHERE RDB$SYSTEM_FLAG = 0 ), TriggerColumns AS ( SELECT RDB$TRIGGER_NAME, RDB$FIELD_NAME FROM RDB$TRIGGER_FIELDS ) SELECT tt.RDB$TRIGGER_NAME AS 触发器名称, tt.RDB$RELATION_NAME AS 关联表名, COALESCE(tc.RDB$FIELD_NAME, rf.RDB$FIELD_NAME) AS 涉及列名, CASE WHEN tc.RDB$FIELD_NAME IS NOT NULL THEN '指定更新列' ELSE '全表列' END AS 列类型 FROM TriggerTables tt JOIN RDB$RELATION_FIELDS rf ON tt.RDB$RELATION_NAME = rf.RDB$RELATION_NAME LEFT JOIN TriggerColumns tc ON tt.RDB$TRIGGER_NAME = tc.RDB$TRIGGER_NAME AND rf.RDB$FIELD_NAME = tc.RDB$FIELD_NAME ORDER BY tt.RDB$TRIGGER_NAME, tt.RDB$RELATION_NAME, rf.RDB$FIELD_NAME;
内容的提问来源于stack exchange,提问作者Avatar
相关产品推荐
相关产品推荐

