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,只允许某些约束类型,并且必须用disable
和novalidate
定义。
关于视图约束的说明 视图约束是表约束的子集,受以下限制:
您只能指定视图的唯一性、主键和外键约束。但是,您可以使用 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 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