列出 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 中从未引用过的列(名称如此有用)并未按预期出现在最终结果中。
假设我有以下 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 中从未引用过的列(名称如此有用)并未按预期出现在最终结果中。