Postgres:使用外键将行插入表中

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

我有一个带有外键

type
的表,它链接到表
wp_types
。 每当我尝试向该表中插入一行时,我都会收到错误:

ERROR:  permission denied for schema base
LINE 1: SELECT 1 FROM ONLY "base"."wp_types" x WHERE "id" OPERATOR(p...
                       ^
QUERY:  SELECT 1 FROM ONLY "base"."wp_types" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x

查询正在作为 postgres 执行。 另外,我不明白这个查询想要做什么,它显然与检查外键约束相关,但我不明白如何做。

sql postgresql
3个回答
2
投票

来自 postgresql 文档:

如果指定了 ONLY,则仅扫描该表。如果未指定 ONLY,则扫描该表及其所有后代表(如果有)。

正如您所提到的,错误与检查外键有关。当指定 ONLY 时,postgres 无法检查它们,并且可能会导致错误。


0
投票

两点:

  1. 是否有可能删除 postgres 用户的超级用户权限?

  2. 基础架构有哪些权限?

现在需要考虑的一件事是您不确定查询正在做什么。 一个简单的

EXPLAIN
可以告诉您它正在做什么,但错误表明问题出在架构权限上,而不是查询正在做什么。

尝试:

 GRANT USAGE ON SCHEMA base TO postgres;

0
投票

我今晚遇到了这个问题,并在 @jnasthis 答案中找到了 why 问题的答案。在这里解释一下,因为我首先发现这个问题:

原始问题中提到的

SELECT
语句(我必须启用额外的日志记录才能看到这一点)是由Postgres生成的,以验证您的外键约束。正是此检查导致了
permission denied for schema
错误,而不是您的
INSERT
查询。

本质上,Postgres 以“数据库所有者”而非当前用户的身份执行 FK 检查。如果数据库所有者没有访问您的架构的权限(例如,如果您像我一样使用

postgres 用户创建它),则检查将由于权限不足而失败。

就我而言,

ALTER SCHEMA :SCHEMA_NAME OWNER TO :DB_OWNER;

足以解决这个问题。
    

© www.soinside.com 2019 - 2024. All rights reserved.