在postgres中触发以锁定带有列表的表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在postgres中触发以锁定带有列表的表相关的知识,希望对你有一定的参考价值。
我在PostgreSQL 10上有一个关于触发器的问题。这就是这种情况。我有一个名为index_name的表,其中包含一个名为index_ref的列。在此字段中,我创建了一个值列表,例如:PBM PI,PBM PO等。我想使用此表存储有效名称,以作为另一个名为gis_osm_places的表的参考。因此,每当有人尝试在列表中插入一个未包含的值时,就会弹出一条异常消息,指出:不允许提交。请使用:(参考清单)这是我的桌子:这是触发器所在的位置:
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();
实际上什么也没发生,我是说我可以添加我想要的任何内容而不会出错。任何想法或代码的升级将不胜感激。预先感谢!
答案
您不需要,也不想为此触发。此功能是内置的。只需在gis_osm_places上创建引用index_name的外键约束即可。
alter table gis_osm_places
add constraint osm_places2index_fk
foreign key (index_a)
references index_name(index_ref);
现在放下触发器和触发器功能。不利的一面是您没有收到自己创建的消息。但是,您可以在应用程序的异常处理中进行处理。
另一答案
我终于找到了问题所在!
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();
以上是关于在postgres中触发以锁定带有列表的表的主要内容,如果未能解决你的问题,请参考以下文章
使用 postgres 构建一个触发器函数来处理 json 数据
Postgres 创建触发器函数以在允许插入之前将值从一列复制到另一列