【问题标题】:How to discover the underlying primary (or unique) key columns from an Oracle view如何从 Oracle 视图中发现底层的主(或唯一)键列
【发布时间】:2011-07-26 22:09:32
【问题描述】:

我想知道是否有可能发现 Oracle 视图中涉及的所有表的底层主(或唯一)键列。这是一个例子来说明我的意思:

CREATE TABLE t_a (
  id number(7),
  primary key(id)
);

CREATE VIEW v_a AS
SELECT * FROM t_a;

所以通过命名约定,我知道v_a.id 实际上是底层t_a 表的主键列。有没有办法通过使用系统视图来正式发现这些信息,例如SYS.ALL_CONSTRAINTSSYS.USER_CONSTRAINTS等?

注:

  • 约束不是在视图上,而是在基础表上。
  • 我对键本身不感兴趣,但对视图的列感兴趣。

【问题讨论】:

    标签: database oracle view schema primary-key


    【解决方案1】:

    您可以通过 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.
    

    问候,
    抢。

    编辑:对于可能的视图列名称,您可以使用此查询。请注意,不能保证您的视图中存在这样的列。

    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.
    

    【讨论】:

    • @Rob,感谢您的意见。这是一个好的开始。现在我需要发现v_a.id 实际上是由t_a.id 支持的列,它是主键的一部分...
    • 这并不容易,因为视图只是一个存储的查询,换句话说:只是文本。您必须解析视图文本。
    • @Rob:您的查询将返回所有基础表的唯一约束。它不会返回视图中的哪些列(如果有的话?)由唯一约束支持。
    • @Vincent:他要求的是“钥匙”而不是“钥匙列”。不过,我现在有一个额外的部分用于列。
    • 我就是这么想的。但我想,Oracle 编译器可能会将这些信息保存在可从 SYS 架构访问的某个地方...
    【解决方案2】:
    SELECT column_name FROM user_ind_columns
      WHERE index_name =
       (SELECT index_name FROM user_constraints
          WHERE constraint_type='P' AND table_name='T_A')
    ORDER BY column_position;
    

    如果您想对视图所依赖的所有表执行此操作,请将 table_name 上的条件更改为:

    table_name IN (SELECT referenced_name FROM user_dependencies
                     WHERE name='view_name' AND referenced_type='TABLE')
    

    【讨论】:

    • 感谢您的意见。这是一个好的开始。现在我需要发现v_a.id 实际上是由t_a.id 支持的列,它是主键的一部分...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2021-09-15
    相关资源
    最近更新 更多