在postgres中触发以锁定带有列表的表

问题描述 投票:0回答:2

我在PostgreSQL 10上有一个关于触发器的问题。这就是这种情况。我有一个名为index_name的表,其中包含一个名为index_ref的列。在此字段中,我创建了一个值列表,例如:PBM PI,PBM PO等。我想使用此表存储有效名称,以作为另一个名为gis_osm_places的表的参考。因此,每当有人尝试在列表中插入一个未包含的值时,就会弹出一条异常消息,指出:不允许提交。请使用:(参考清单)这是我的桌子:enter image description here这是触发器所在的位置:

CREATE FUNCTION public.check_column_value()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF

AS $BODY$

DECLARE
ref_allowed character varying;
BEGIN

IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE'
THEN

IF NEW.index_a is not null OR NEW.index_a NOT IN (SELECT index_ref from public.index_name)
THEN

ref_allowed := (SELECT string_agg(index_ref,',') from public.index_name);
RAISE EXCEPTION 'NOT ALLOWED COMMIT. PLEASE USE : %',ref_allowed;

END IF;
RETURN NEW;

END IF;
END;

$BODY$;

ALTER FUNCTION public.check_column_value()
    OWNER TO "postgres";

CREATE TRIGGER check_column_value
    BEFORE INSERT
    ON public.gis_osm_places
    FOR EACH ROW
    EXECUTE PROCEDURE public.check_column_value();

实际上什么也没发生,我是说我可以添加我想要的任何内容而不会出错。任何想法或代码的升级将不胜感激。预先感谢!

postgresql database-trigger
2个回答
0
投票

您不需要,也不想为此触发。此功能是内置的。只需在gis_osm_places上创建引用index_name的外键约束即可。

alter table gis_osm_places 
  add constraint osm_places2index_fk 
      foreign key (index_a)
      references index_name(index_ref);

现在放下触发器和触发器功能。不利的一面是您没有收到自己创建的消息。但是,您可以在应用程序的异常处理中进行处理。


0
投票

我终于找到了问题所在!

CREATE FUNCTION public.check_column_value()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF

AS $BODY$

DECLARE
ref_allowed character varying;
BEGIN

IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE'
THEN

IF NEW.index_a is not null AND NEW.index_a NOT IN (SELECT index_ref from public.index_name)
THEN

ref_allowed := (SELECT string_agg(index_ref,',') from public.index_name);
RAISE EXCEPTION 'NOT ALLOWED COMMIT. PLEASE USE : %',ref_allowed;

END IF;
RETURN NEW;

END IF;
END;

$BODY$;

ALTER FUNCTION public.check_column_value()
    OWNER TO "postgres";

CREATE TRIGGER check_column_value
    BEFORE INSERT OR UPDATE
    ON public.gis_osm_places
    FOR EACH ROW
    EXECUTE PROCEDURE public.check_column_value();
© www.soinside.com 2019 - 2024. All rights reserved.