ORA-00922:修改视图时缺少或无效选项 - Oracle

时间:2017-04-19 15:56:08

标签: sql oracle

我尝试将非可空约束添加到视图中的列。这是我的疑问:

alter view myTable add constraint pk_generate2 check(pk is not null);

我试过这个:

alter view myTable add constraint pk_generate2 check(pk is not null) disable;

这也不起作用。

它给出了标题中给出的错误。如何更改查询以使其有效?感谢。

PS:我怀疑没有解决方案,因为没有办法将这样的约束添加到视图中。但是我将ROWNUM添加为视图的主键,以使其可被Entity Framework接受。

2 个答案:

答案 0 :(得分:1)

查看约束

Oracle数据库不强制执行视图约束。但是,您可以通过对基表的约束来强制执行对视图的约束。

您只能在视图上指定唯一,主键和外键约束,并且仅在DISABLE NOVALIDATE模式下支持它们。您无法在对象列的属性上定义视图约束。

阅读本文了解更多详情:constraint in Oracle

答案 1 :(得分:0)

如果要将rownum添加为虚拟主键列,则应添加主键约束,而不仅仅是空检查约束 - 无论如何都不允许在视图上使用。

作为noted in the documentation,只允许使用某些约束类型,并且必须使用disablenovalidate进行定义。

  

关于视图约束的注释
  视图约束是表约束的子集,受以下限制:

     
      
  • 您只能在视图上指定唯一,主键和外键约束。但是,您可以使用WITH CHECK OPTION子句定义视图,这相当于为视图指定检查约束。
  •   
  • 仅在DISABLE NOVALIDATE模式下支持视图约束。您无法指定任何其他模式。声明视图约束时,必须指定关键字DISABLE。您无需明确指定NOVALIDATE,因为它是默认值   ...
  •   

所以你可以这样做:

-- example view with rownum dummy PK column
create view v42 as
select rownum as pk, table_name
from user_tables d;

View V42 created.

alter view v42 add constraint pk_generate2 primary key (pk) disable novalidate;

View V42 altered.

文档还指出

  

Oracle不强制执行视图约束。但是,视图上的操作受基础基表上定义的完整性约束的约束。这意味着您可以通过对基表的约束来强制执行对视图的约束。

但基于rownum(或row_number())的值不会出现问题。