postgresql – Postgres插入或更新触发器WHEN条件(旧)
发布时间:2020-12-13 15:51:04 所属栏目:百科 来源:网络整理
导读:我需要写入插入或更新触发器,但是在WHEN条件下使用比较OLD和NEW行. 根据文档,对于插入操作,OLD为null.如何在INSERT和UPDATE触发器的WHEN条件下使用OLD? 示例触发器: CREATE TRIGGER mytrigger BEFORE INSERT OR UPDATE ON "mytable" FOR EACH ROW WHEN (NE
我需要写入插入或更新触发器,但是在WHEN条件下使用比较OLD和NEW行.
根据文档,对于插入操作,OLD为null.如何在INSERT和UPDATE触发器的WHEN条件下使用OLD? 示例触发器: CREATE TRIGGER mytrigger BEFORE INSERT OR UPDATE ON "mytable" FOR EACH ROW WHEN (NEW.score > 0 AND OLD.score <> NEW.score) EXECUTE PROCEDURE mytrigger(); 但是对于插入OLD是null. 解决方法
选项A:
您可以更改代码,使条件位于触发器功能中,而不是触发器本身.使用此方法,OLD将仅在UPDATE中使用. 触发: CREATE TRIGGER mytrigger BEFORE INSERT OR UPDATE ON "mytable" FOR EACH ROW EXECUTE PROCEDURE mytrigger(); 触发功能: CREATE OR REPLACE FUNCTION mytrigger() RETURNS trigger AS $BODY$ begin if NEW.score > 0 then --code for Insert if (TG_OP = 'INSERT') then YOUR CODE end if; --code for update if (TG_OP = 'UPDATE') then if OLD.score <> NEW.score then -- (if score can be null see @voytech comment to this post) YOUR CODE end if; end if; end if; return new; end; $BODY$ LANGUAGE plpgsql VOLATILE 选项B: 正如Thilo建议写两个共享相同触发函数的触发器. 触发器: CREATE TRIGGER mytrigger1 BEFORE INSERT ON "mytable" FOR EACH ROW WHEN NEW.score > 0 EXECUTE PROCEDURE mytrigger(); CREATE TRIGGER mytrigger2 BEFORE UPDATE ON "mytable" FOR EACH ROW WHEN (NEW.score > 0 AND OLD.score <> NEW.score) EXECUTE PROCEDURE mytrigger(); 触发功能: CREATE OR REPLACE FUNCTION mytrigger() RETURNS trigger AS $BODY$ begin YOUR CODE return new; end; $BODY$ LANGUAGE plpgsql VOLATILE (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |