oracle - 在 Oracle 中确定检查约束的来源
问题描述
当我尝试从更新 oracle 数据库的应用程序中完成操作时,我收到了 oracle 检查约束错误。错误是这样的:
ORA-02290: 违反的检查约束 (.SYS_C00357711) 必须是 Y 或 N
我使用名称 SYS_C00357711 在 all_constraint 表中查找检查约束。表中搜索条件为:不能为空。
有2个问题我不明白。首先,列值不是 N/Y,而是 3 或 4 个字符串。其次,我的查询返回的记录没有此列为空。该值与其他记录一致。
我不是在看正确的约束吗?
创建错误消息(..violated 必须是 N 或 Y)的文本在哪里设置?显然不是约束表中的搜索条件字段。
解决方案
似乎开发人员(编写该应用程序)引起了混乱。
以下是 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_LINE
but或其他任何东西。MESSAGE
ALERT
因此,请检查应用程序本身。您不会在数据库中找到该信息,除非这样的 PL/SQL 代码存储为一个过程 - 独立或在一个包中。在这种情况下:
select * from user_source where upper(text) like '%SYS_C007013%';