Функция запуска PGSQL Записать исключение в таблицу журнала - PullRequest
0 голосов
/ 27 ноября 2018

Справочная информация

Я новичок в PostgreSQL, и у меня возникли некоторые проблемы с этой функцией триггера, которую я, очевидно, значительно упростил ниже.Я мог бы попросить помочь исправить запрос, но я думаю, что справлюсь с этим, и меня больше беспокоит то, что у меня много подобных функций, и мне нужен способ, чтобы иметь возможность понять, почему он не работаети какие из них терпят неудачу.

Вопрос

Как я могу отловить исключения, возникающие в этой функции, и записать их в какую-нибудь таблицу журнала, чтобы я мог просмотреть и исправить каждое из них?В идеале я хотел бы написать оператор sql, который также не удалось добавить в таблицу журнала, чтобы я мог видеть, что именно пошло не так.Я видел несколько примеров подобных вещей, но они не соответствуют моему сценарию.

CREATE OR REPLACE FUNCTION my_func() RETURNS TRIGGER AS $$
   BEGIN
        IF (TG_OP = 'INSERT') THEN

            INSERT INTO my_table(...)
            SELECT ...
            FROM table_1 t1
            JOIN table_2 t2 ON t1.id = t2.id               
            ON CONFLICT (id)
            DO UPDATE
            field1 = EXCLUDED.field1;

        ELSIF(TG_OP = 'UPDATE') THEN

            UPDATE my_table 
            SET ...
            FROM table_1 t1
            JOIN table_2 t2 ON t1.id = t2.id
            WHERE id = NEW.id;

         ELSIF (TG_OP = 'DELETE') THEN
            DELETE FROM my_table WHERE id= OLD.id;
        END IF;
      RETURN NULL;
   END;
$$ LANGUAGE plpgsql;

1 Ответ

0 голосов
/ 27 ноября 2018

Вот пример, использующий обычную функцию, а не триггер, хотя это действительно то же самое, что и при ведении журнала:

Таблица для хранения ошибок:

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://rextester.com/BQPG27732

Контекст показывает сортировку вызовов.Конечно, вы можете добавить больше полей, связанных с ошибками, я выбрал лишь несколько из них, доступных в GET STACKED DIAGNOSTICS

...