列出 Oracle 数据库中所有视图的所有 table 个原始列

List all table origin columns for all views in Oracle database

假设我有以下 tables:

TABLE_A (ID; NAME; ...)
TABLE_B (ID; NAME; TABLE_A_FK; ...)

然后我通过这个视图公开 table 数据:

SELECT a.id, a.name, b.name FROM TABLE_A a
JOIN TABLE_B b
ON a.id = b.table_a_fk;

如何为我的视图获取此视图中引用的 table 和列的信息。

这里我期望:

TABLE_NAME  COLUMN_NAME
-----------------------
TABLE_A     ID
TABLE_A     NAME
TABLE_B     NAME
TABLE_B     TABLE_A_FK

目前解决此问题的唯一方法是解析此语句中的 SQL 文本:

select view_name, text_vc from sys.all_views;

但一点都不好笑 ;)。

您可以使用此查询获取列和 table 名称

select c.table_name, 
       c.column_name, 
       c.column_id
       from sys.all_tab_columns c
inner join sys.all_views v on c.owner = v.owner 
                              and c.table_name = v.view_name
                              and v.view_name IN ('EDW_OPS_DB_ADM_VW')
order by c.table_name, c.column_id;

--这个只给出了table个名字 select 所有者为 schema_name, 命名为 view_name, referenced_owner 作为 schema_name, referenced_name, referenced_type 来自 sys.all_dependencies 其中类型 = 'VIEW' 和名字在('EDW_OPS_DB_ADM_VW') 和 ( 'SYSADM') 的所有者 按名称排序 ;

这似乎是 Oracle 社区长期以来一直渴望的东西,自 11g 以来似乎有可能实现,但它不可用 pre-installed。需要查看一个名为 dependency$ 的未记录系统 table,更具体地说是 d_attrs 列。

幸运的是,有一个基于社区的旧修复程序称为 DBA_DEPENDENCY_COLUMNS,最初由 Rob van Wijk and made easier to copy by Ronald's Oracle 制作。
Copy-pasting 这种对您的数据库的看法(需要 sys-privileges)应该让您有可能 运行 一些 SQL 比如:

CREATE TABLE table_a(id NUMBER, name VARCHAR2(200), never_referenced_column_A VARCHAR2(100));
CREATE TABLE table_b(id NUMBER, name VARCHAR2(200), table_a_fk NUMBER, never_referenced_column_B NUMBER);

CREATE OR REPLACE VIEW TESTING_COLUMN_DEPENDENCIES AS 
SELECT a.id,
       a.name a_name,
       b.name b_name
  FROM table_a a
  JOIN table_b b
    ON a.id = b.table_a_fk;

SELECT NAME,
       referenced_name,
       referenced_column
  FROM sys.dba_dependency_columns
 WHERE referenced_name IN ('TABLE_A', 'TABLE_B');

table A 和 B 中从未引用过的列(名称如此有用)并未按预期出现在最终结果中。