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

Jos*_*iga 4 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();
Run Code Online (Sandbox Code Playgroud)

但我相信这将停止整行的更新。我只需要避免对 auxId 字段进行更新,但允许对其行进行任何其他更新。

Anc*_*ron 7

如果您基本上想让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();
Run Code Online (Sandbox Code Playgroud)

  • 我不会推荐此解决方案,因为您无法以任何方式响应,可能会导致大量调试。如果您对“静默”程序感到满意,那么这是可以的。 (2认同)

Lau*_*lbe 6

当然,只要在列更改时抛出错误:

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

CREATE TRIGGER noupdate
   BEFORE UPDATE ON product FOR EACH ROW
   EXECUTE PROCEDURE noupdate();
Run Code Online (Sandbox Code Playgroud)