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
相关产品推荐
相关产品推荐

