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

获取触发器更新的列列表: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:05:29