не могу понять. я хочу написать тригерную функцию, но у меня и new и old с значениями null, и я не могу получить доступ к полям.
Я делаю update записи, и по идеи old должен не быть null, но так не получается... Что может быть не так?
CREATE OR REPLACE FUNCTION throw_frozen_date_exception() RETURNS trigger AS $$
declare
rowDate date := null;
maxFrozenDate date := (select max(date)
from accruing_frozen_days);
BEGIN
IF (TG_OP = 'DELETE') THEN
rowDate := (old.end_date AT TIME ZONE 'Europe/Moscow')::DATE;
ELSIF (TG_OP = 'UPDATE') THEN
rowDate := (old.end_date AT TIME ZONE 'Europe/Moscow')::DATE;
ELSIF (TG_OP = 'INSERT') THEN
rowDate := (new.end_date AT TIME ZONE 'Europe/Moscow')::DATE;
END IF;
if old.end_date is null then
RAISE EXCEPTION 'old is null';
end if;
if rowDate is not null and maxFrozenDate is not null and rowDate <= maxFrozenDate then
RAISE EXCEPTION 'Нельзя менять транзакции в закрытых днях';
end if;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER check_frozen
after insert or update or delete
on transactions
execute procedure throw_frozen_date_exception();
Посмотрите внимательно на определение триггера в "\d transactions" — увидите. ;)
честно говоря совсем не вижу... Был бы очень рад, если бы подсказали)
Смотрите: Triggers: check_frozen AFTER INSERT OR DELETE OR UPDATE ON transactions FOR EACH STATEMENT EXECUTE PROCEDURE throw_frozen_date_exception() Из https://www.postgresql.org/docs/current/sql-createtrigger.html : FOR EACH ROW FOR EACH STATEMENT This specifies whether the trigger function should be fired once for every row affected by the trigger event, or just once per SQL statement. If neither is specified, FOR EACH STATEMENT is the default.
Огромное спасибо, разобрался)))
Обсуждают сегодня