加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读