【问题标题】:Postgresql 9.3 permission denied for schema when trying to delete a row尝试删除行时,Postgresql 9.3 权限被拒绝
【发布时间】:2015-06-08 13:02:42
【问题描述】:

我创建了一个名为“common”的用户组和一个名为“application”的用户。下面的脚本:

CREATE ROLE common NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT;
GRANT USAGE ON SCHEMA portal TO common;
GRANT ALL ON ALL TABLES IN SCHEMA portal TO common;
GRANT ALL ON ALL SEQUENCES IN SCHEMA portal TO common;
CREATE ROLE application INHERIT LOGIN PASSWORD 'xxxxxx';
GRANT common TO application;

为了确保权限已应用于用户“应用程序”,我执行了以下返回 true 的命令:

 

select has_table_privilege ('application', 'portal.noticias', 'delete')
   return: t
select has_schema_privilege ('application', 'portal', 'usage')
   return: t

使用用户“application”,您可以在“portal.noticias”表中插入、更新和选择数据,但是在尝试删除记录时会出现以下错误:

ERROR:  permission denied for schema portal
LINE 1: SELECT 1 FROM ONLY "portal"."noticias" x WHERE "codnoticia" ...                               ^
QUERY:  SELECT 1 FROM ONLY "portal"."noticias" x WHERE "codnoticia" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x

我不知道我做错了什么,但我感谢任何帮助。

【问题讨论】:

  • 表是如何定义的?我只是尝试用您发布的内容重现问题,它对我有用。也许该表有一个 ON DELETE 触发器,或者其他什么?
  • 没有触发器
  • 我意识到,即使现在尝试使用 postgres root 用户删除记录,也会发生同样的错误。现在我知道错误不是权限。但是,我不知道它是什么。
  • 将 psql 中 \d+ portal.noticias 的输出添加到您的问题中 - 最好添加在新的空数据库中重现问题所需的所有 SQL。
  • 谢谢阿乔。为了复制同样的情况,我提供了两个脚本文件。第一个用于创建数据库 (goo.gl/kIgFC4),第二个用于基本操作 (goo.gl/e9cfCb),尤其是删除。

标签: postgresql-9.3 permission-denied user-permissions


【解决方案1】:

给你带来问题的是这个约束:

ALTER TABLE portal.Fotos_Noticias ADD CONSTRAINT
fk_FotoNoticia_Noticia FOREIGN KEY (codNoticia)
REFERENCES portal.Noticias (codNoticia) MATCH FULL
ON DELETE NO ACTION ON UPDATE CASCADE;

如果您删除该约束,您的 DELETE 语句将按预期运行。但是你当然想要约束。

表的所有者是 AcadAdmin,但 AcadAdmin 无权访问架构门户:

test=# select has_schema_privilege('acadadmin', 'portal', 'usage');
 has_schema_privilege 
----------------------
 f
(1 row)

test=# delete from portal.noticias where codNoticia = 1;
ERROR:  permission denied for schema portal
LINE 1: SELECT 1 FROM ONLY "portal"."noticias" x WHERE "codnoticia" ...
                           ^
QUERY:  SELECT 1 FROM ONLY "portal"."noticias" x WHERE "codnoticia" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x

让我们看看如果我们让 AcadAdmin 访问门户会发生什么:

test=# grant usage on schema portal to AcadAdmin;
GRANT
test=# select has_schema_privilege('acadadmin', 'portal', 'usage');
 has_schema_privilege 
----------------------
 t
(1 row)

test=# delete from portal.noticias where codNoticia = 1;
DELETE 1
test=# 

宾果游戏!

我不是这方面错综复杂的专家,但我想这是有原因的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2017-08-22
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多