Отслеживание изменений при вставке, обновлении или удалении таблицы для PostgreSQL с использованием триггера - PullRequest
0 голосов
/ 16 ноября 2018

Я создаю таблицу для отслеживания изменений, но она возвращает следующую ошибку:

"(psycopg2.InternalError) элемент управления достиг конца процедуры запуска без возврата контекста: PL / pgSQL функция change_trigger () "

Всякий раз, когда я выполняю любое из следующих действий: insert, change или update

См. Ниже таблицу и функцию триггера

Создать таблицу для регистрации изменений

Create schema logging;
Create table logging.history(
            id serial,
            tstamp timestamp default now (),
            schemaname text,
            tabname text, 
            operation text, 
            who text default current_user,
            new_val json,
            old_val json);

Создать функцию

CREATE function
change_trigger()
RETURNS trigger as $$
BEGIN
        IF TG_OP = 'Insert'
        THEN
            Insert into logging.history (tabname, schemaname, operation, new_val)
            Values (TG_TABLE_NAME,TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW));
            RETURN NEW;
        ELSIF TG_OP = 'Update'
        THEN
            Insert into logging.history (tabname, schemaname, operation, new_val, old_val)
            Values (TG_TABLE_NAME,TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW), row_to_json(OLD));
            RETURN NEW; 
        ELSIF TG_OP = 'Delete'
        THEN
            Insert into logging.history (tabname, schemaname, operation, old_val)
            Values (TG_TABLE_NAME,TG_TABLE_SCHEMA, TG_OP, row_to_json(OLD));
            RETURN OLD;
    END IF;
    END;
    $$ LANGUAGE 'plpgsql';

Функция связывания триггера с таблицей:

CREATE TRIGGER t AFTER INSERT OR UPDATE OR DELETE ON mytemp

   FOR EACH ROW EXECUTE PROCEDURE change_trigger();

Например, когда я выполняю следующее:

INSERT into mytemp(column1)
    VALUES ('id2323900')  

ошибка возвращается как:

управление достигло конца процедуры запуска без возврата контекста: Функция PL / pgSQL change_trigger ()

1 Ответ

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

Имена tg_op ('INSERT', 'UPDATE', 'DELETE') не ('Insert', 'Update', 'Delete') - чувствительны к регистру, ИЛИ меняют TG_OP = 'Insert' на TG_OP ilike('insert').И я бы добавил оператор «else» в конце с уведомлением:

ELSE 
    NOTICE RAISE 'Unknown tg_op';
    RETURN OLD;
END IF;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...