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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在postgres中触发以锁定带有列表的表相关的知识,希望对你有一定的参考价值。

我在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();

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

答案

您不需要,也不想为此触发。此功能是内置的。只需在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 创建触发器函数以在允许插入之前将值从一列复制到另一列

将数据插入另一个表时触发以更新带有时间戳的表

我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?

PostgreSQL 中的表锁