не могу понять. я хочу написать тригерную функцию, но у меня и 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.
Огромное спасибо, разобрался)))
Обсуждают сегодня