Определить происхождение проверочного ограничения в Oracle - PullRequest
0 голосов
/ 24 февраля 2019

Я получил ошибку ограничения проверки оракула при попытке выполнить действие из приложения, которое обновляет базу данных оракула.Ошибка такова:

ORA-02290: нарушено проверочное ограничение (.SYS_C00357711) должно быть Y или N

Я смотрю проверочное ограничение в таблице all_constraint, используяимя, SYS_C00357711.Условие поиска в таблице: не может быть нулевым.

Есть 2 проблемы, которые я не понимаю.Сначала значения столбца - это не N / Y, а строка из 3 или 4 символов.Во-вторых, запись, которую возвращает мой запрос, не имеет этот столбец как ноль.Значение согласуется с другими записями.

Не смотрю ли я на правильное ограничение?
Где находится текст, который создает сообщение об ошибке (..violated должно быть N или Y)?Это явно не поле условия поиска в таблице ограничений.

1 Ответ

0 голосов
/ 24 февраля 2019

Похоже, что разработчик (который написал это приложение) вызвал путаницу.

Вот как 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) способно сделать это, возможно, не используя вызов DBMS_OUTPUT.PUT_LINE, а MESSAGE, ALERT или что-либо еще.

Поэтому проверьте само приложение.Вы не найдете эту информацию в базе данных, если только такой код PL / SQL не хранится как процедура - автономная или в пакете.В этом случае:

select * from user_source where upper(text) like '%SYS_C007013%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...