构建一个触发器,避免更新一列的值

Build a trigger that avoids to update the values of one column

我在 PostgretSQL 中有一个 table。我想构建一个避免更新 colb1 列的触发器。此列有五个选项:Rea、Can、Loa、Mul、Alm。所以触发器不允许将值从 Rea 上传到 Can。

我构建了这个函数,但是失败了。

CREATE OR REPLACE FUNCTION example_trigger()
  RETURNS trigger AS
$BODY$
BEGIN
     new.colb1.tabl1 = 'Rea' := old.colb1.tabl1 = 'Can';
     new.colb1.tabl1 = 'Can' := old.colb1.tabl1 = 'Rea';
     RETURN new;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


DROP TRIGGER IF EXISTS trigger_name ON table1;
  CREATE TRIGGER trigger_name BEFORE UPDATE ON table1
    FOR EACH ROW EXECUTE PROCEDURE example_trigger();

我编辑了我的 post 并做了以下更改:

CREATE OR REPLACE FUNCTION example_trigger()
    RETURNS TRIGGER AS
$$
BEGIN
    NEW.colb1 := OLD.colb1;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER not_changes
 BEFORE UPDATE 
 ON tabl1
 FOR EACH ROW
 EXECUTE PROCEDURE example_trigger();

这不完全是我想要的,因为我希望值 Loa、Mul 和 Alm 可以更新。

对您的函数进行轻微修改,以停止将 colb1ReaCan 修改为 CanRea

CREATE OR REPLACE FUNCTION example_trigger()
    RETURNS TRIGGER AS
$$
BEGIN
    IF OLD.colb1 in ('Rea', Can') AND NEW.colb1 IN ('Rea', 'Can') THEN
       NEW.colb1 := OLD.colb1;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

这不会阻止用户使用中间 UPDATE 更改为 Loa/Mul/Alm 之一,然后再更改为 ReaCan