【问题标题】:ORA-00922: missing or invalid option on modifying a view - Oracle [duplicate]ORA-00922:修改视图时缺少或无效选项 - Oracle [重复]
【发布时间】: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 作为主键添加到视图中,以使其被实体框架接受。

【问题讨论】:

  • 我通过在视图中包含一个主键解决了这个问题。

标签: sql oracle


【解决方案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不接受这样的配置。
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多