Функция Postgres для создания ошибки генерации таблицы аудита INSERT содержит больше выражений, чем целевые столбцы

У меня есть таблица, содержащая идентификатор, статус, дату добавления. Id и dateadded по умолчанию имеют целые значения nextval и current_timestamp соответственно. Затем у меня есть триггер, который вызывает функцию при вставке, обновлении или удалении. В функции все, что он делает, это резервное копирование и отслеживание изменений в таблице состояний. Этот метод успешно работал, когда в таблицу добавлялось более одного поля. В таблице состояния я добавляю только поле состояния и позволяю базе данных позаботиться о двух других полях, и я получаю сообщение об ошибке. Похоже, мне нужно сделать что-то другое в функции? Я добавляю данные в эти таблицы, используя python для автоматизации, и пытался добавить запись в таблицу вручную с той же ошибкой.

Error while fetching data from PostgreSQL INSERT has more expressions than target columns
LINE 2:        (TG_OP, NEW.*)
                       ^
QUERY:  INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
       (TG_OP, NEW.*)
CONTEXT:  PL/pgSQL function api_input.d_status_list_func() line 4 at SQL statement

Код функции:

create function d_status_list_func() returns trigger
    language plpgsql
as
$$
BEGIN
IF TG_OP = 'INSERT' THEN
  INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
       (TG_OP, NEW.*);
  RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
   INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
        (TG_OP, NEW.*);
   RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
   INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
        (TG_OP, OLD.*);
   RETURN OLD;
END IF;
END;
$$;

alter function d_status_list_func() owner to blahblah;

Любая помощь очень ценится.


person Stephen Yorke    schedule 09.03.2020    source источник


Ответы (1)


Вставка не удалась, потому что вы объявляете три столбца для insert (id, status, dateadded), но вы даете ему 4 значения: операцию (вставка, обновление, удаление), затем 3 исходных столбца.

Предположительно, в вашей таблице аудита есть (или должна быть) колонка, в которой хранится выполняемая операция.

Если это так, вы должны указать этот столбец в выражении insert:

INSERT INTO api_audit.d_status_list (operation, id, status, dateadded) 
VALUES (TG_OP, NEW.*);

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

INSERT INTO api_audit.d_status_list (operation, id, status, dateadded) 
VALUES (TG_OP, NEW.id, NEW.status, NEW.dateadded);
person GMB    schedule 09.03.2020