我有一个带有外键
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 执行。 另外,我不明白这个查询想要做什么,它显然与检查外键约束相关,但我不明白如何做。
来自 postgresql 文档:
如果指定了 ONLY,则仅扫描该表。如果未指定 ONLY,则扫描该表及其所有后代表(如果有)。
正如您所提到的,错误与检查外键有关。当指定 ONLY 时,postgres 无法检查它们,并且可能会导致错误。
两点:
是否有可能删除 postgres 用户的超级用户权限?
基础架构有哪些权限?
现在需要考虑的一件事是您不确定查询正在做什么。 一个简单的
EXPLAIN
可以告诉您它正在做什么,但错误表明问题出在架构权限上,而不是查询正在做什么。
尝试:
GRANT USAGE ON SCHEMA base TO postgres;
我今晚遇到了这个问题,并在 @jnas 的 this 答案中找到了 why 问题的答案。在这里解释一下,因为我首先发现这个问题:
原始问题中提到的
SELECT
语句(我必须启用额外的日志记录才能看到这一点)是由Postgres生成的,以验证您的外键约束。正是此检查导致了 permission denied for schema
错误,而不是您的 INSERT
查询。
本质上,Postgres 以“数据库所有者”而非当前用户的身份执行 FK 检查。如果数据库所有者没有访问您的架构的权限(例如,如果您像我一样使用 postgres
用户创建它),则检查将由于权限不足而失败。
就我而言,
ALTER SCHEMA :SCHEMA_NAME OWNER TO :DB_OWNER;
足以解决这个问题。