2017-04-19 353 views
0

我试图将不可空的约束添加到我的视图中的列。这里是我的查询:ORA-00922:修改视图时丢失或无效的选项 - 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作为视图的主键添加到实体框架中。

+0

我通过在视图中包含一个主键来解决问题。 – jason

回答

1

视图约束

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

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

阅读这篇文章,了解详情:constraint in Oracle

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())的值不会成为问题。

+0

我已经完成了你所说的。但EF不接受这种配置。 – jason

相关问题