триггер для вычитания столбца из другого в той же таблице - PullRequest
0 голосов
/ 29 июня 2018

Здравствуйте, у меня есть таблица ниже:

 id | breakname | start | finish | duration 
----+-----------+-------+--------+----------

Мне нужен триггер для расчета разницы между началом и концом в столбце длительности, когда данные были введены в другие столбцы.

Я создал следующий код:

CREATE OR REPLACE FUNCTION break_duration_insert_update() RETURNS trigger AS $BODY$
BEGIN
    if NEW.duration is null then
        NEW.duration := SET duration = break(finish) - break(start);
    end if;
RETURN NEW;
end
$BODY$
 LANGUAGE 'plpgsql';

CREATE TRIGGER break_duration
    AFTER INSERT OR UPDATE ON break FOR EACH ROW
    WHEN (NEW.duration IS NULL)
    EXECUTE PROCEDURE break_duration_insert_update()

Но я получаю следующую ошибку при вводе данных:

ERROR:  column "finish" does not exist
LINE 1: SELECT finish - start
               ^
QUERY:  SELECT finish - start
CONTEXT:  PL/pgSQL function break_duration_insert_update() line 4 at assignment

Я попытался ввести данные без установленного триггера, и это сработало, так что я думаю, что что-то пропустил в кодировке триггера.

Большое спасибо

Dave

1 Ответ

0 голосов
/ 29 июня 2018

SET duration = как часть задания := совершенно неверно.

Чтобы получить доступ к столбцам текущих строк, вам необходимо поставить префикс каждой ссылки на столбец с new. Так что вам нужно

NEW.duration := new.finish - new.start;

Также нельзя назначить новые значения в триггере AFTER, поэтому ваш триггер должен быть определен как ДО триггера.

CREATE TRIGGER break_duration
    <b>BEFORE</b> INSERT OR UPDATE ON break FOR EACH ROW
    WHEN (NEW.duration IS NULL)
    EXECUTE PROCEDURE break_duration_insert_update()

Не связано, но: имя языка является идентификатором, не заключайте его в одинарные кавычки:

LANGUAGE plpgsql;
...