构建一个触发器,避免更新一列的值
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 可以更新。
对您的函数进行轻微修改,以停止将 colb1
从 Rea
或 Can
修改为 Can
或 Rea
。
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
之一,然后再更改为 Rea
或 Can
我在 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 可以更新。
对您的函数进行轻微修改,以停止将 colb1
从 Rea
或 Can
修改为 Can
或 Rea
。
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
之一,然后再更改为 Rea
或 Can