创建历史记录触发器?

时间:2019-12-03 14:59:31

标签: postgresql triggers

我用postgresql创建2个表:

afp
(
  id bigint NOT NULL DEFAULT nextval('afp_id_seq'::regclass),
  perm_number character varying(90),
  type bigint,
  start_date character varying(50),
  CONSTRAINT afp_pkey PRIMARY KEY (id)
)

history_afp
(
  id bigint NOT NULL DEFAULT nextval('history_afp_id_seq'::regclass),
  reason bigint,
  type bigint,
  ask_date character varying(50),
  CONSTRAINT history_afp_pkey PRIMARY KEY (id)
)

我想要一个历史记录触发器,因此当我删除afp中的一行时,该行将进入history_afp

CREATE FUNCTION public.before_update()
    RETURNS TRIGGER
    SET SCHEMA 'public'
    LANGUAGE plpgsql
    AS $$
    BEGIN
    INSERT INTO public.history_afp (
        type,
        ask_date
        )
    VALUES (
        OLD.type,
        OLD.start_date);
        RETURN NEW;
END;
$$; 

CREATE TRIGGER before_update_trigger
  BEFORE DELETE
  ON public.afp
  FOR EACH ROW
  EXECUTE PROCEDURE public.before_update();

当我删除表afp中的行时,它在history_afp中创建了新行,但又在表afp中创建了该行。

有人知道为什么我会有这个错误吗?

1 个答案:

答案 0 :(得分:0)

您应该

RETURN OLD;

而不是

RETURN NEW;

问题是删除触发器中未定义NEW,并且返回NULL将中止删除。