Luk*_*der 4 database oracle schema view primary-key
我想知道是否有可能发现Oracle视图中涉及的所有表的基础主(或唯一)键列.这是一个展示我的意思的例子:
CREATE TABLE t_a (
id number(7),
primary key(id)
);
CREATE VIEW v_a AS
SELECT * FROM t_a;
Run Code Online (Sandbox Code Playgroud)
因此,通过命名约定,我知道它v_a.id实际上是基础t_a表的主键列.有没有正式发现通过使用系统视图下使用该信息的任何方式,如SYS.ALL_CONSTRAINTS,SYS.USER_CONSTRAINTS等?
注意:
您可以通过user_dependencies视图找到该信息:
SQL> CREATE TABLE t_a
2 ( id number(7)
3 , primary key(id)
4 )
5 /
Table created.
SQL> CREATE VIEW v_a AS SELECT * FROM t_a
2 /
View created.
SQL> select c.constraint_name
2 from user_dependencies d
3 , all_constraints c
4 where d.name = 'V_A'
5 and d.referenced_type = 'TABLE'
6 and d.referenced_link_name is null
7 and d.referenced_owner = c.owner
8 and d.referenced_name = c.table_name
9 and c.constraint_type = 'P'
10 /
CONSTRAINT_NAME
------------------------------
SYS_C0051559
1 row selected.
Run Code Online (Sandbox Code Playgroud)
问候,
Rob.
编辑:对于可能的视图列名称,您可以使用此查询.请注意,您无法保证视图中存在此类列.
SQL> select c.constraint_name
2 , 'V_' || substr(c.table_name,3) || '.' || cc.column_name possible_view_column
3 from user_dependencies d
4 , all_constraints c
5 , all_cons_columns cc
6 where d.name = 'V_A'
7 and d.referenced_type = 'TABLE'
8 and d.referenced_link_name is null
9 and d.referenced_owner = c.owner
10 and d.referenced_name = c.table_name
11 and c.constraint_type = 'P'
12 and c.owner = cc.owner
13 and c.constraint_name = cc.constraint_name
14 /
CONSTRAINT_NAME POSSIBLE_VIEW_COLUMN
------------------------------ -------------------------------------------------------------
SYS_C0051561 V_A.ID
1 row selected.
Run Code Online (Sandbox Code Playgroud)