Как сделать кастомный текст ошибки для констрейнта?

Когда в Oracle делается внешний ключ с ON DELETE = RESTRICT, то при попытке удаления родительской записи выкидывается ошибка: «ORA-02292: violated integrity constraint (owner.constraintname)- child record found », можно ли как-нибудь эту ошибку для каждого констрейнта уточнить, чтобы выдавался более осмысленный текст, например, «Нельзя удалить эту картинку, потому что оно привязано к видеоролику»?

Может быть триггер или комментарий к констрейнту.
  • Вопрос задан
  • 3651 просмотр
Пригласить эксперта
Ответы на вопрос 2
asumin
@asumin Автор вопроса
/Web/PHP
парсить в приложении текст ошибки для его руссификации вообще очень сомнительная практика
Ответ написан
xtender
@xtender
Заменить нельзя, но дополнить можно:
create or replace trigger catch_unique
   after servererror on database
   disable
declare
   l_sql_text   ora_name_list_t;
   l_msg        varchar2(2000) := null;
   l_stmt       varchar2(2000) := null;
begin
  if IS_SERVERERROR(1) then
      /* если нужен текст ошибки, запроса и тд:
      for depth in 1 .. ora_server_error_depth loop
        l_msg := l_msg || ora_server_error_msg(depth);
      end loop;

      for i in 1 .. ora_sql_txt(sql_text) loop
         l_stmt := l_stmt || sql_text(i);
      end loop;
      */
      raise_application_error(-20001,'Ooops!');
  end if;
end;
/
sho err;
--если ошибок нет, то включаем:
alter trigger catch_unique enable;
--а теперь проверка:
SQL> insert into xt_unique1 values(1);
insert into xt_unique1 values(1)
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Ooops!
ORA-06512: at line 16
ORA-00001: unique constraint (XTENDER.SYS_C0043662) violated

Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы