Триггерная функция Postgres

Мне нужна помощь в триггерах Postgres.

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

sold boolean;
id_shop int;

В нем хранится информация о том, продан ли предмет или в каком магазине он находится.

Мне нужен триггер, если я изменю "продано" на true, то он также изменит id_shop на NULL (его не может быть в магазине, если он продан...)

Пробовал разные способы, но не работает или выдает ошибку при обновлении cmd...

create or replace function pardota_masina_veikals() RETURNS trigger AS $pardota_masina$
begin
  IF NEW.sold=true THEN
    update masinas
      SET id_shop=null WHERE id=NEW.id;
  END IF;
  RETURN NEW;
END;
$pardota_masina$ LANGUAGE plpgsql;


CREATE TRIGGER pardota_masina_nevar_but_veikala 
    AFTER INSERT OR UPDATE ON masinas FOR EACH ROW EXECUTE PROCEDURE pardota_masina_veikals();

person Martins Svirksts    schedule 09.05.2012    source источник


Ответы (1)


Прежде всего, вам нужен триггер before, если вы хотите изменить значение обновляемой (или вставляемой) строки.

Во-вторых, вам не нужно «обновлять» таблицу, просто присвойте новое значение строке NEW:

create or replace function pardota_masina_veikals() 
RETURNS trigger 
AS 
$pardota_masina$
begin
  IF NEW.sold=true THEN
    NEW.id_shop = NULL;
 END IF;
RETURN NEW;
END;
$pardota_masina$ 
LANGUAGE plpgsql;

CREATE TRIGGER pardota_masina_nevar_but_veikala 
   BEFORE INSERT OR UPDATE ON masinas 
   FOR EACH ROW EXECUTE PROCEDURE pardota_masina_veikals();
person a_horse_with_no_name    schedule 09.05.2012