首页 > 解决方案 > 在 Oracle 中确定检查约束的来源

问题描述

当我尝试从更新 oracle 数据库的应用程序中完成操作时,我收到了 oracle 检查约束错误。错误是这样的:

ORA-02290: 违反的检查约束 (.SYS_C00357711) 必须是 Y 或 N

我使用名称 SYS_C00357711 在 all_constraint 表中查找检查约束。表中搜索条件为:不能为空。

有2个问题我不明白。首先,列值不是 N/Y,而是 3 或 4 个字符串。其次,我的查询返回的记录没有此列为空。该值与其他记录一致。

我不是在看正确的约束吗?
创建错误消息(..violated 必须是 N 或 Y)的文本在哪里设置?显然不是约束表中的搜索条件字段。

标签: oracleconstraints

解决方案


似乎开发人员(编写该应用程序)引起了混乱。

以下是 Oracle 通常如何处理此类检查约束违规:

SQL> create table test
  2    (col varchar2(1) check (col in ('Y', 'N')));

Table created.

SQL> insert into test (col) values ('X');
insert into test (col) values ('X')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.SYS_C007013) violated


SQL>

如您所见,没有额外的“必须是 Y 或 N”消息。

我怀疑应用程序执行以下操作:首先,找到约束名称:

SQL> select constraint_name from user_constraints where table_name = 'TEST';

CONSTRAINT_NAME
------------------------------
SYS_C007013

SQL>

现在使用它:声明一个异常(ex_chk在我的示例中)和exception_init说明ex_chk应该用于ORA-02290. 因此,如果违反了检查约束,则显示一条类似于原始消息的消息并添加更多信息:

SQL> declare
  2    ex_chk    exception;
  3    pragma    exception_init(ex_chk, -2290);
  4  begin
  5    insert into test (col) values ('x');
  6  exception
  7    when ex_chk then
  8      dbms_output.put_line
  9        ('ORA-02290: check constraint (.SYS_C007013) violated must be Y or N');
 10  end;
 11  /
ORA-02290: check constraint (.SYS_C007013) violated must be Y or N

PL/SQL procedure successfully completed.

SQL>

我猜你不会在 SQL*Plus 中这样做,但是任何应用程序(例如,Oracle Forms)都能够做到这一点,可能不使用call DBMS_OUTPUT.PUT_LINEbut或其他任何东西。MESSAGEALERT

因此,请检查应用程序本身。您不会在数据库中找到该信息,除非这样的 PL/SQL 代码存储为一个过程 - 独立或在一个包中。在这种情况下:

select * from user_source where upper(text) like '%SYS_C007013%';

推荐阅读