Postgres триггер, чтобы избежать обновления в столбце - PullRequest
1 голос
/ 10 мая 2019

У меня есть база данных postgres, а также таблица с именем product.В этой таблице у меня есть столбец автоинкремента с именем auxId (не первичный ключ таблицы).Я хочу избежать каких-либо обновлений в этой колонке.Как это можно сделать с помощью триггера postgres, чтобы избежать обновлений auxid?Я попытался:

   #trigger to avoid updates on nameId
CREATE OR REPLACE FUNCTION stop_change_on_auxId()
  RETURNS trigger AS
$BODY$
BEGIN
 IF NEW.auxId <> OLD.auxId THEN

 END IF;

 RETURN NEW;
END;
$BODY$


CREATE TRIGGER avoid_auxid_changes
  BEFORE UPDATE
  ON product
  FOR EACH ROW
  EXECUTE PROCEDURE stop_change_on_auxId();

, но я считаю, что это остановит обновление для всей строки.Мне просто нужно избежать обновления в поле auxId, но разрешить любое другое обновление в его строке.

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Если вы в основном хотите сделать столбец auxid неизменным для внешнего мира, то вот вам:

CREATE OR REPLACE FUNCTION stop_change_on_auxId()
  RETURNS trigger AS
$BODY$
BEGIN
  -- always reset the auxId to the value already stored
  NEW.auxId := OLD.auxId;
  RETURN NEW;
END;
$BODY$


CREATE TRIGGER avoid_auxid_changes
  BEFORE UPDATE
  ON product
  FOR EACH ROW
  EXECUTE PROCEDURE stop_change_on_auxId();
2 голосов
/ 10 мая 2019

Конечно, просто сгенерируйте ошибку при изменении столбца:

CREATE FUNCTION noupdate() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   IF NEW.auxid <> OLD.auxid THEN
      RAISE EXCEPTION 'not allowed';
   END IF;
END;$$;

CREATE TRIGGER noupdate
   BEFORE UPDATE ON product FOR EACH ROW
   EXECUTE PROCEDURE noupdate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...