【问题标题】:oracle - create a view with a primary keyoracle - 使用主键创建视图
【发布时间】:2012-02-27 22:22:16
【问题描述】:

这个问题在含义上是重复的,但我必须澄清它。 Oracle 文档特别是 says 可以在 CREATE VIEW 子句中指定主键(11g 文档具有相同的概念)。然而,当我尝试这样做时:

create or replace view ABC(A, B, C, CONSTRAINT A_PK PRIMARY KEY (A)) ....

我得到ORA-00922: missing or invalid option 指向“主键”短语。问题是,是我的问题还是 Oracle 文档有问题?

【问题讨论】:

    标签: oracle oracle10g ddl


    【解决方案1】:

    您必须将约束创建为禁用。这确实是一种提示优化器以影响查询计划的方法。

    数据完整性在底层表级别强制执行。当您考虑它时,在视图级别强制执行主键约束并没有多大意义。普通的 ole 视图不存储数据,它只是其他表提供的数据的“视图”。如果主键约束仅放置在某个基础表的视图上,并且该表本身并不强制执行约束,那么视图将如何处理有人直接使用破坏其约束的数据更新表的情况? (即表格不知道通过视图对其施加了哪些约束)

    【讨论】:

    • 对我来说只是文件问题。
    【解决方案2】:

    简单的答案是您的语法不正确。您必须指定DISABLE

    NOVALIDATE 禁用主键验证,在视图中这是默认设置,因此会自动包含在内;但是如果你使用它会更清楚,因为在一个可爱的双重否定中,disable novalidate 禁用了禁用主键的能力。

    rely 是可选的;它指定创建视图时是否考虑主键。 rely的反义词是norely

    创建视图约束有很多限制,因为它依赖于下表,正如@RC 已经指出的那样,它并不值得。但是,如果您只需要它来记录文档,那么您就可以了:

    SQL> create table tmp_test ( a number(10), b varchar2(120) );
    
    Table created.
    
    SQL>
    SQL> insert into tmp_test
      2   select level, 'b'
      3     from dual
      4  connect by level <= 20
      5          ;
    
    20 rows created.
    
    SQL>  commit ;
    
    Commit complete.
    
    SQL>
    SQL> alter table tmp_test
      2    add constraint tmp_test_pk
      3        primary key (a)
      4        using index;
    
    Table altered.
    
    SQL>
    SQL> create or replace view v_tmp_test (a, b
      2     , constraint v_tmp_test_pk primary key (a) rely disable novalidate) as
      3   select a, b
      4     from tmp_test
      5          ;
    
    View created.
    
    SQL>
    

    来自documentation

    查看约束

    Oracle 不强制执行视图约束。但是,对视图的操作 受制于底层证券定义的完整性约束 基表。这意味着您可以对视图实施约束 通过对基表的约束。

    关于视图约束的注释视图约束是表的一个子集 并受到以下限制:

    您只能指定唯一、主键和外键约束 关于意见。但是,您可以使用 WITH CHECK OPTION 定义视图 子句,相当于为 查看。

    仅在 DISABLE NOVALIDATE 模式下支持视图约束。你 不能指定任何其他模式。您必须指定关键字 DISABLE 当您声明视图约束时。您无需指定 NOVALIDATE 明确,因为它是默认值。

    RELY 和 NORELY 参数是可选的。查看约束,因为 它们是非强制的,通常用 RELY 参数指定 让它们更有用。 RELY 或 NORELY 关键字必须在 禁用关键字。详情请参阅“RELY 条款”。

    因为视图约束不是直接强制的,所以你不能指定 初始延期或可延期。

    您不能指定 using_index_clause、exceptions_clause 子句,或references_clause 的ON DELETE 子句。

    您不能在对象列的属性上定义视图约束。

    【讨论】:

    • 这是救命稻草,我设法克服了 Entity Framework 6 的问题,即从生成可空列的“联合所有”表创建的视图中的可空值。是否“更改视图”-> 更改视图 v_tmp_test 添加约束 v_tmp_test_pk 主键 (a) 依赖禁用 novalidate;
    猜你喜欢
    • 2015-01-04
    • 2012-07-11
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多