查表被哪些存储过程引用,首选dba_dependencies但需注意:需select_catalog_role或dba权限;referenced_name为大写;跨schema需指定referenced_owner;动态sql调用无法捕获;user_source可补查但有4000字符限制;依赖不递归,需人工逐层展开;还需联查dba_objects确认valid状态。
查表被哪些存储过程引用,用 dba_dependencies 但得注意权限和大小写
直接跑 select * from dba_dependencies where referenced_name = 'tpd_trus_info_affi' and referenced_type = 'table' 是最常见做法,但它只在你有 select_catalog_role 或 dba 权限时才可用。没权限时会报错 ora-00942: table or view does not exist,不是 sql 写错了,是权限卡住了。
另外,REFERENCED_NAME 字段存的是大写名,哪怕建表时用了双引号小写,这里也自动转成大写。所以别写 WHERE REFERENCED_NAME = 'tpd_trus_info_affi',得写 'TPD_TRUS_INFO_AFFI'。大小写不匹配就查不到,连条记录都不会返回。
如果目标表在非当前用户 Schema 下(比如 PRODUCT.TPD_TRUS_INFO_AFFI),必须加上 AND REFERENCED_OWNER = 'PRODUCT',否则可能漏掉跨 Schema 的引用。
DBA_DEPENDENCIES 查不到动态 SQL 调用的表,这是硬限制
只要过程里用了 EXECUTE IMMEDIATE 或 DBMS_SQL 拼接表名,哪怕拼的是 'TPD_TRUS_INFO_AFFI',DBA_DEPENDENCIES 就完全不记录这条依赖。Oracle 在编译期做静态分析,根本不会去解析字符串内容。
这种情况下,你得手动搜源码:
- 查
USER_SOURCE:用SELECT name, type FROM user_source WHERE LOWER(text) LIKE '%tpd_trus_info_affi%'(注意这里用小写模糊匹配更稳妥) - 但
USER_SOURCE.text是LONG类型,LIKE只能匹配前 4000 字符,超长过程可能漏检 - 触发器、包体、函数都覆盖,但视图定义不在
USER_SOURCE里,得另查USER_VIEWS
查视图依赖的基表,DBA_DEPENDENCIES 只给一层,不递归
如果视图 V_EMP_DETAIL 是基于另一个视图 V_EMP_BASE 写的,而 V_EMP_BASE 才真正查了 TPD_TRUS_INFO_AFFI 表,那么 DBA_DEPENDENCIES 里只会显示 V_EMP_DETAIL → V_EMP_BASE,不会显示 V_EMP_DETAIL → TPD_TRUS_INFO_AFFI。
想看到完整链路,得自己递归查:
- 先查出所有直接依赖
V_EMP_DETAIL的对象(TYPE = 'VIEW'且NAME = 'V_EMP_DETAIL') - 对每个结果再查它依赖谁,直到
REFERENCED_TYPE = 'TABLE' - 但要防循环引用——比如 A 视图引用 B,B 又引用 A,没控制就会死循环
生产环境不建议写自动递归脚本,人工逐层展开更可控。
查出来一堆对象,怎么快速确认它们还有效?别只看依赖,要看状态
DBA_DEPENDENCIES 只告诉你“曾经有依赖”,不保证对象现在还能用。比如某存储过程因为表删了列已变成 INVALID,但它依然留在依赖视图里。
得联合查 DBA_OBJECTS:
SELECT object_name, status FROM dba_objects WHERE object_name IN ('PROC1', 'FUNC2') AND owner = 'PRODUCT'- 状态是
VALID才说明当前可执行;INVALID就得先重编译,否则改表结构时可能踩坑 - 特别注意:
STATUS列不在DBA_DEPENDENCIES里,必须单独查DBA_OBJECTS
依赖关系本身是静态快照,对象有效性是运行时状态——这两个维度必须一起看,缺一不可。











