代码之家  ›  专栏  ›  技术社区  ›  Denis

当前命令触发的操作已修改了要更新的元组

  •  1
  • Denis  · 技术社区  · 7 年前

    我刚刚在数据库中添加了一个新的AFTER触发器,目前正在尝试使用一些计算布尔值更新现有表的一个新列。

    但是,我遇到了以下错误:

    错误:当前命令触发的操作已修改了要更新的元组
    提示:考虑使用AFTER触发器而不是BEFORE触发器将更改传播到其他行。

    我知道这与我添加的新后触发器有关,但我注意到 使残废 所以我不知道为什么会这样。。。因为没用,我 已完全删除 触发器,但我仍然无法更新表:

    CREATE TABLE public.extractions_2
    (
        id bigint NOT NULL DEFAULT nextval('extractions_2_id_seq'::regclass),
        settling_bank text,
        created_at timestamp without time zone,
        is_prehedge boolean,
        --many more irrelevant columns...
        CONSTRAINT extractions_2_pkey PRIMARY KEY (id),
        CONSTRAINT extractions_2_filecode_created_at_key UNIQUE (filecode, created_at)
    )
    WITH (
      OIDS=FALSE
    );
    
    -- Trigger: set_is_prehedge on public.extractions_2
    
    -- DROP TRIGGER set_is_prehedge ON public.extractions_2;
    
    CREATE TRIGGER set_is_prehedge
      AFTER INSERT
      ON public.extractions_2
      FOR EACH ROW
      EXECUTE PROCEDURE public.set_is_prehedge();
    ALTER TABLE public.extractions_2 DISABLE TRIGGER set_is_prehedge;
    
    CREATE OR REPLACE FUNCTION public.set_is_prehedge()
      RETURNS trigger AS
    $BODY$
    begin
    update NEW
    set NEW.is_prehedge= case when(NEW.settling_bank LIKE '%PRE HEDGE%') THEN true ELSE false END;
    return NEW;
    end;
    

    我尝试将表更新为:

    update extractions_2 set 
    is_prehedge = case when(settling_bank LIKE '%PRE HEDGE%') THEN true ELSE false END;
    

    。。。怎么了?

    答案 :我需要一个BEFORE触发器;此外,我之前还有一个错误的UPDATE触发器,它会阻止我更新字段,我没有在这里发布它,因为我认为它不相关(它只是不相关,因为我以前从未更新过表,只是插入了)

    1 回复  |  直到 7 年前
        1
  •  1
  •   Laurenz Albe    7 年前

    你想要一个 BEFORE INSERT 触发。

    而不是试图 UPDATE 你所要做的就是给 NEW :

    CREATE OR REPLACE FUNCTION public.set_is_prehedge()
      RETURNS trigger LANGUAGE plpgsql AS
    $$BEGIN
       NEW.is_prehedge := (NEW.settling_bank LIKE '%PRE HEDGE%');
       RETURN NEW;
    END;$$;