powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обработка ошибок
5 сообщений из 5, страница 1 из 1
Обработка ошибок
    #38801653
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Стоит задача перехватывать ошибки операций DML и их далее обрабатывать.
Вопрос: есть ли возможность с помощью каких-либо настроек формализовать текст сообщения об ошибке.

Например

При выполнении операции DELETE FROM table1 WHERE id=2 .

Получаем ошибку

ОШИБКА: UPDATE или DELETE в таблице "table1" нарушает ограничение внешнего ключа "table2_fk1" таблицы "table2"
DETAIL: На ключ (id)=(2) всё ещё есть ссылки в таблице "table2".

Требуется получить имя сущности, вызывающей эту ошибку, в данном случае это - ограничение внешнего ключа.
Парсить текст крайне не надежно.
Обрабатывать код ошибки - не информативно.

Спасибо.
...
Рейтинг: 0 / 0
Обработка ошибок
    #38801814
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot, мы ловим ошибку в эксепшене plsql и делаем raise с текстом, который уже можно парсить.

(короче - подписался на каменты)
...
Рейтинг: 0 / 0
Обработка ошибок
    #38801822
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
второй вариант - сделали функцию show_error(код, "текст") и вызываем её так:

Код: sql
1.
2.
select show_error(xxx, "ошибка такая-то!")
where -- проверка_наличия_дублирования_ключей_и_ещё_чего-нибудь



но вообще, такого рода ошибка как у вас пользователям не пригодна совершенно, так что, похоже, должен быть какой-то "средний слой", в котором можно уже логгировать это так, как оно вам отдаётся постгресом.
...
Рейтинг: 0 / 0
Обработка ошибок
    #38801839
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Weedно вообще, такого рода ошибка как у вас пользователям не пригодна совершенно, так что, похоже, должен быть какой-то "средний слой", в котором можно уже логгировать это так, как оно вам отдаётся постгресом.

Вот если бы ошибка была типа: "вы пытаетесь ввести в поле n число меньше 1000, что недопустимо" тогда наш вариант с функцией, подставляемой в произвольный запрос с проверкой (а так же в триггеры или rules) и возвращающей ошибку был бы удобен.
...
Рейтинг: 0 / 0
Обработка ошибок
    #38801910
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
big-trot, 40.6.6.1. Obtaining information about an error
RETURNED_SQLSTATE - Table A-1. PostgreSQL Error Codes
CONSTRAINT_NAME
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
drop table if exists x, y;
create table x(id int primary key);
create table y(id int, CONSTRAINT fk_x_id FOREIGN KEY (id) REFERENCES x (id));
insert into x values (1);
insert into y values (1);

do $$
declare 
  err_state text;
  err_constraint text;
begin
  begin
    delete from x;
  exception when others then 
    GET STACKED DIAGNOSTICS err_state = RETURNED_SQLSTATE,
                            err_constraint = CONSTRAINT_NAME;
    if err_state = '23503' then
      raise 'ошибку вызвано %', err_constraint;
    else
      raise '%', sqlerrm;
    end if;
  end;  
end$$;

Код: plaintext
1.
ERROR: ошибку вызвано fk_x_id
SQL state: P0001
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обработка ошибок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]