You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:表所有者插入数据时因外键关联表权限被拒

PostgreSQL插入操作外键权限报错原因分析

表结构信息

sapiens=# \d financiero.almac_solicitud_paz_salvo
                                                                  Table "financiero.almac_solicitud_paz_salvo"
         Column         |            Type             |                                                        Modifiers
------------------------+-----------------------------+-------------------------------------------------------------------------------------------------------------------------
 id_solicitud_paz_salvo | bigint                      | not null default nextval(('financiero.sq_financiero_almac_solicitud_paz_salvo_id_solicitud_paz_salvo'::text)::regclass)
 fec_solicitud          | timestamp(0) with time zone | not null
 id_persona             | integer                     | not null
 observacion            | text                        |
 id_estado              | smallint                    | not null
 id_tipo_paz_salvo      | smallint                    | not null
 id_usuario             | bigint                      |
Indexes:
    "pk_financiero_almac_solicitud_paz_salvo_id_solicitud_paz_salvo" PRIMARY KEY, btree (id_solicitud_paz_salvo)
Foreign-key constraints:
    "fk_financiero_almac_solicitud_paz_salvo_id_estado" FOREIGN KEY (id_estado) REFERENCES general.gener_estado(id_estado)
    "fk_financiero_almac_solicitud_paz_salvo_id_persona" FOREIGN KEY (id_persona) REFERENCES general.gener_persona(id_persona)
    "fk_financiero_almac_solicitud_paz_salvo_id_tipo_paz_salvo" FOREIGN KEY (id_tipo_paz_salvo) REFERENCES financiero.almac_tipo_paz_salvo(id_tipo_paz_salvo)

表权限信息

sapiens=# \dp financiero.almac_solicitud_paz_salvo
                                               Access privileges
   Schema   |           Name            | Type  |       Access privileges       | Column privileges | Policies
------------+---------------------------+-------+-------------------------------+-------------------+----------
 financiero | almac_solicitud_paz_salvo | table | ureport=arwdDxt/ureport      +|                   |

执行的插入语句

INSERT INTO financiero.almac_solicitud_paz_salvo
(fec_solicitud, id_persona, observacion, id_estado, id_tipo_paz_salvo, id_usuario)
VALUES('2022-09-19'::timestamp, 17962, '', 2, 3, 17);

报错信息

ERROR:  permission denied for relation almac_tipo_paz_salvo
CONTEXT:  SQL statement "SELECT 1 FROM ONLY "financiero"."almac_tipo_paz_salvo" x WHERE "id_tipo_paz_salvo" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x"

********** Error **********

ERROR: permission denied for relation almac_tipo_paz_salvo
SQL state: 42501
Context: SQL statement "SELECT 1 FROM ONLY "financiero"."almac_tipo_paz_salvo" x WHERE "id_tipo_paz_salvo" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x"

报错原因

当向带有外键约束的表插入数据时,PostgreSQL会自动执行**键共享锁(FOR KEY SHARE)**的查询,验证外键引用的目标表(financiero.almac_tipo_paz_salvo)中是否存在对应的记录。

虽然你是financiero.almac_solicitud_paz_salvo的所有者且拥有该表的全部权限,但你没有被授予对financiero.almac_tipo_paz_salvo的SELECT权限(至少是针对外键字段的查询权限),导致PostgreSQL无法完成外键合法性验证的查询,进而抛出权限拒绝错误。

简单来说:外键约束的验证需要读取关联目标表的数据,当前用户缺少目标表的查询权限,所以插入操作失败。

内容的提问来源于stack exchange,提问作者Manuel Córdoba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:05:22