Функция триггера, которая обновляет некоторые столбцы после обновления определенного столбца - PullRequest
1 голос
/ 02 июня 2019

У меня есть таблица Ticketsforsale:

Ticketsforsale(ticket_id, starting_date, price)

Мне нужно создать функцию триггера, которая, в случае обновления по параметру «начальная_дата», будет заменять старую «начальную_дату» обновленной в дополнение кпонижение «цены» на 20%.

Функция триггера, с которой я до сих пор сталкивался, следующая:

 create or replace function automatic_update()
RETURNS TRIGGER AS $$ 
begin 
IF new.starting_date != ticketsforsale.starting_date 
THEN old.starting_date = new.starting_date , 
     ticketsforsale.price = ticketsforsale.price * (20/100) ; 
END IF ; 
RETURN NEW ; 
END ;
$$ 
LANGUAGE plpgsql ;

CREATE TRIGGER automation
BEFORE INSERT OR UPDATE ON public.ticketsforsale
FOR EACH ROW EXECUTE PROCEDURE automatic_update()

Код функции триггера работает правильно, без ошибок.

Но когда я обновляю значение столбца «начальная_дата» и пытаюсь сохранить изменения, я получаю следующую ошибку:

Отсутствует запись предложения FROM в таблице 'ticketsforsale'ЛИНИЯ 1: ВЫБРАТЬ new.starting_date! = Ticketsforsale.starting_date * ЗАПРОС: ВЫБРАТЬ new.starting_date! = Ticketsforsale.starting_date КОНТЕКСТ: PL / pgsql функция automatic_update () строка 3 на IF

Я возилсяс функцией в значительной степени.Однако, похоже, я не понял это правильно, спасибо.

1 Ответ

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

Вы можете использовать псевдозапись old для доступа к значениям перед обновлением. Не имеет смысла устанавливать значения old. И такой триггер не имеет смысла для INSERT, поскольку здесь нет старого значения, которое может измениться. И вы не снижаете цену на 20%, а устанавливаете ее на 20%.

Что-то вроде следующего должно работать, как вы хотите.

CREATE OR REPLACE FUNCTION automatic_update()
                           RETURNS TRIGGER
AS
$$ 
BEGIN
  IF new.starting_date <> old.starting_date THEN
    new.price := old.price * .8; 
  END IF; 

  RETURN new; 
END;
$$ 
LANGUAGE plpgsql;

CREATE TRIGGER automation
               BEFORE UPDATE
               ON public.ticketsforsale
               FOR EACH ROW
               EXECUTE PROCEDURE automatic_update();

Вы также можете переместить условие в триггеры WHEN.

CREATE OR REPLACE FUNCTION automatic_update()
                           RETURNS TRIGGER
AS
$$ 
BEGIN
  new.price := old.price * .8; 

  RETURN new; 
END;
$$ 
LANGUAGE plpgsql;

CREATE TRIGGER automation
               BEFORE UPDATE
               ON public.ticketsforsale
               FOR EACH ROW
               WHEN (new.starting_date <> old.starting_date)
               EXECUTE PROCEDURE automatic_update();
...