контроль ошибок триггера postgresql достиг конца триггера без RETURN - PullRequest
1 голос
/ 21 июня 2019

Редактировать: я добавил обновленный код в свое сообщение, мне не хватает return null вне моего блока ЕСЛИ

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

SQL Error [2F005]: ERROR: control reached end of trigger procedure without RETURN
  Where: PL/pgSQL function update_history()

Мой код:

-- create function for updates to track history
CREATE function update_history ()
RETURNS TRIGGER
as $$
BEGIN   
    IF NEW.discipline <> OLD.discipline THEN
    INSERT INTO history
        (ShiftId, fieldName, OldValue, NewValue)
    VALUES(New.shift_id, 'discipline', OLD.discipline, NEW.discipline);
    END IF;
return null; -- notice return outside the IF block
END;
$$
language plpgsql;


-- create trigger for my table after updates are made to the working table
create trigger update_history_trigger
after update on working
for each row execute PROCEDURE update_history();

1 Ответ

2 голосов
/ 21 июня 2019

Ваша функция не может достичь оператора RETURN, если условие не выполняется.Поместите оператор за пределами блока IF.Возвращаемое значение игнорируется, и вы можете использовать NULL вместо NEW.

CREATE FUNCTION update_history ()
RETURNS TRIGGER
AS $$
BEGIN
    IF NEW.discipline <> OLD.discipline THEN
        INSERT INTO history (ShiftId, fieldName, OldValue, NewValue)
        VALUES(NEW.shift_id, 'discipline', OLD.discipline, NEW.discipline);
    END IF;
    RETURN NULL;
END;
$$
LANGUAGE plpgsql;

За документацию:

Возвращаемое значениетриггер уровня строки срабатывает ПОСЛЕ или триггер уровня оператора срабатывает ДО или ПОСЛЕ всегда игнорируется;это также может быть нулевым.

...