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

Posted

技术标签:

【中文标题】ORA-00922:修改视图时缺少或无效选项 - Oracle [重复]【英文标题】:ORA-00922: missing or invalid option on modifying a view - Oracle [duplicate] 【发布时间】:2017-04-19 15:56:08 【问题描述】:

我正在尝试向视图中的列添加不可为空的约束。这是我的查询:

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 作为主键添加到视图中,以使其被实体框架接受。

【问题讨论】:

我通过在视图中包含一个主键解决了这个问题。 【参考方案1】:

查看约束

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

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

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

【讨论】:

【参考方案2】:

如果您将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())的值不会有问题。

【讨论】:

你说的我已经做了。但是EF不接受这样的配置。

以上是关于ORA-00922:修改视图时缺少或无效选项 - Oracle [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Apex ORA-00922:缺少或无效选项

Oracle SQL - ALTER VIEW:ORA-00922:缺少或无效选项

ORA-00922: 创建 PL/SQL 过程时选项丢失或无效

Oracle SQL Plus:创建用户时出现错误“ORA-00922:缺少或无效选项”

一个存储过程,报错如下 13 PL/SQL:ORA-00922:缺少或无效选项 13 PL/SQL:SQL Statement ignored

创建oracle数据库时,出现ORA-00922: 选项缺失或无效