Postgres触发器以避免在列中进行更新

时间:2019-05-10 17:23:06

标签: postgresql triggers

我有一个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 个答案:

答案 0 :(得分:1)

当然,更改列时会抛出错误:

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();

答案 1 :(得分:1)

如果您基本上想使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();