2012-02-06 208 views
3

这个问题是重复的意思,我仍然要澄清它。 Oracle文档特别是says,它可以在CREATE VIEW子句中指定主键(11g docs具有相同的概念)。然而,当我尝试做这样的:oracle - 用主键创建视图

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

我会在“主键”短语ORA-00922: missing or invalid option指点。问题是,是Oracle还是Oracle文档有问题?

回答

2

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

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

+0

这只是我的文档问题。 – 2012-02-06 13:04:27

8

最简单的答案就是你的语法不正确。您必须指定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关键字必须在 DISABLE关键字之前。有关更多信息,请参阅“RELY条款”。

因为视图约束不是直接执行的,所以不能指定 INITIALLY DEFERRED或DEFERRABLE。

您无法指定references_clause的using_index_clause,exceptions_clause 子句或ON DELETE子句。

您无法定义对象列的属性的视图约束。