Postgres 权限问题

Posted

技术标签:

【中文标题】Postgres 权限问题【英文标题】:Postgres Privileges issue 【发布时间】:2020-09-14 23:59:21 【问题描述】:

我在 postgres 中设置新用户时遇到问题,部分原因可能是我对 postgres 幕后工作原理的了解。我正在使用 TestBox 和 Lucee 运行单元测试,并且在 postgres 超级用户下一切正常,但是在创建新用户并授予权限后,单元测试失败

这是我的代码:

CREATE USER test_user WITH PASSWORD 'postgres';
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA not_public TO test_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO test_user;
GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA public TO test_user;
GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA not_public TO test_user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO test_user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA not_public TO test_user;

单元测试从公共模式运行一个过程,该过程引用 not_public 模式中的表,但立即出错并显示以下消息:

 ERROR: permission denied for schema not_public Where: PL/pgSQL function p_unit__delete_test_production() line 18 at SQL statement

我为新用户/被授予者运行了以下命令:

SELECT table_catalog, table_schema, table_name, privilege_type
FROM information_schema.table_privileges

过程中引用的所有模式的所有表都具有选择、插入、更新和删除权限。我的赠款中是否缺少步骤?这是其他问题吗?任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

试试

GRANT USAGE ON SCHEMA not_public TO test_user;

请注意,错误消息 permission denied for schema not_public 是在架构本身上,而不是在架构内的特定对象上。

另外,GRANT ... ON ALL ... IN SCHEMA... 仅适用于该架构中已存在的对象,这是与 postgres 的 GRANT 命令混淆的常见原因。

【讨论】:

谢谢,丹尼尔。因此,如果我希望能够授予对特定架构上所有功能的访问权限,我必须授予用户在架构上的使用权限,而不是在架构中授予所有权限? @user2921015:通常情况下,你两者都做。在这里看到一个很好的答案:What GRANT USAGE ON SCHEMA exactly do?

以上是关于Postgres 权限问题的主要内容,如果未能解决你的问题,请参考以下文章

GCP SQL Postgres 权限问题:无法使用生成的 symfony db 使用 postgres 用户运行查询

Postgres:即使授予了授权,也拒绝架构的权限

在我的 PostGres 表上授予所有权限,但在尝试插入/选择时仍然收到“权限被拒绝”错误

Postgres - 向角色组中的现有用户授予权限

授予对 Postgres 中所有表的访问权限

Postgres:除 phpPgAdmin 之外的所有权限都被拒绝