Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 通过级联删除子记录时,如何使父记录数据可用_Postgresql_Triggers - Fatal编程技术网

Postgresql 通过级联删除子记录时,如何使父记录数据可用

Postgresql 通过级联删除子记录时,如何使父记录数据可用,postgresql,triggers,Postgresql,Triggers,考虑以下两个表: CREATE TABLE public.parent ( id bigint NOT NULL DEFAULT nextval('parent_id_seq'::regclass), CONSTRAINT pk_parent PRIMARY KEY (id) ); CREATE TABLE public.child ( child_id bigint NOT NULL DEFAULT nextval('child_child_id_seq'::regclass),

考虑以下两个表:

CREATE TABLE public.parent
(
  id bigint NOT NULL DEFAULT nextval('parent_id_seq'::regclass),
  CONSTRAINT pk_parent PRIMARY KEY (id)
);

CREATE TABLE public.child
(
  child_id bigint NOT NULL DEFAULT nextval('child_child_id_seq'::regclass),
  parent_id bigint NOT NULL,
  CONSTRAINT pk_child PRIMARY KEY (child_id),
  CONSTRAINT inx_parent FOREIGN KEY (parent_id)
      REFERENCES public.parent (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE INDEX fki_child
  ON public.child
  USING btree
  (parent_id);

CREATE TRIGGER child_trg
  BEFORE DELETE
  ON public.child
  FOR EACH ROW
  EXECUTE PROCEDURE public.trg();
trg
的定义如下:

CREATE OR REPLACE FUNCTION public.trg()
  RETURNS trigger AS
$BODY$BEGIN
    INSERT INTO temp
    SELECT p.id
    FROM parent p
    WHERE
        p.id = OLD.parent_id;
    return OLD;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

为了总结正在发生的事情,有两个表具有简单的父子关系和级联关系。还有一个触发器定义在监听删除的孩子身上。我需要访问触发器中的父数据,当子记录由于父子关系上的级联而被删除时。但是我不能,因为它们已经被删除了!有人知道怎么做吗?

一个解决方案是在删除之前在父级上创建一个
触发器,它可以查看所有数据


几乎正确,您需要编写两个触发器,一个用于父触发器,一个用于子触发器,以防直接删除子触发器。谢谢。@Mehran:您说过
由于父子关系的级联,孩子的记录被删除了
。您提到的附加触发器似乎不在这个问题的范围内。您是对的,但这是因为在我的原始问题中不存在这样的问题,它是在您将触发器移动到父表后引入的。我并不是说你的答案是错误的,只是在我的情况下,我不得不写两个来补偿直接删除。无论如何,谢谢你。
CREATE OR REPLACE FUNCTION public.trg_parent()
  RETURNS trigger AS
$func$
BEGIN
   INSERT INTO some_tbl (id)  -- use target list !!
   VALUES (OLD.parent_id);

   RETURN OLD;
END
$func$ LANGUAGE plpgsql;

CREATE TRIGGER parent_trg
BEFORE DELETE ON public.parent
FOR EACH ROW EXECUTE PROCEDURE public.trg_parent();