Вот пример, использующий обычную функцию, а не триггер, хотя это действительно то же самое, что и при ведении журнала:
Таблица для хранения ошибок:
CREATE TABLE errors (id SERIAL, sql_state TEXT, message TEXT, detail TEXT, hint TEXT, context TEXT);
Функция, которая работает и имеет обработку / запись исключений:
CREATE OR REPLACE FUNCTION my_func()
RETURNS VOID AS
$BODY$
DECLARE
_sql_state TEXT;
_message TEXT;
_detail TEXT;
_hint TEXT;
_context TEXT;
BEGIN
PERFORM 1 / 0;
EXCEPTION
WHEN OTHERS THEN
GET STACKED DIAGNOSTICS
_sql_state := RETURNED_SQLSTATE,
_message := MESSAGE_TEXT,
_detail := PG_EXCEPTION_DETAIL,
_hint := PG_EXCEPTION_HINT,
_context := PG_EXCEPTION_CONTEXT;
INSERT INTO errors (sql_state, message, detail, hint, context)
VALUES (_sql_state, _message, _detail, _hint, _context);
END
$BODY$
LANGUAGE plpgsql;
После вызова функции таблица errors
содержит:
![enter image description here](https://i.stack.imgur.com/aSIur.png)
См. https://rextester.com/BQPG27732
Контекст показывает сортировку вызовов.Конечно, вы можете добавить больше полей, связанных с ошибками, я выбрал лишь несколько из них, доступных в GET STACKED DIAGNOSTICS