为什么我在 pgAdmin 4 上遇到公共模式的权限被拒绝错误?

cpb*_*e94 56 database postgresql permission-denied pgadmin pgadmin-4

我正在尝试在 pgAdmin 4 中查看来自 AACT 数据库的原始数据。我使用的是 Mac 计算机。当我尝试查看“complete_oncology”表中的前 100 行时,出现以下错误:

ERROR: permission denied for schema public
LINE 1: SELECT * FROM public.complete_oncology
                      ^
SQL state: 42501
Character: 15
Run Code Online (Sandbox Code Playgroud)

是我权限不够吗?如果是,我如何授予自己查看该表的权限?我可以看到 AACT 数据库中不同模式的其他表。我读过一些用户建议通过以下方式授予自己权限,但没有运气:

ERROR: permission denied for schema public
LINE 1: SELECT * FROM public.complete_oncology
                      ^
SQL state: 42501
Character: 15
Run Code Online (Sandbox Code Playgroud)

这只会出现一个错误:

ERROR:  relation "complete_oncology" does not exist
SQL state: 42P01
Run Code Online (Sandbox Code Playgroud)

eay*_*din 111

在 PostgreSQL 15 中,用户处理表创建权限的方式发生了变化。与 pgAdmin 没有直接关系,但我认为人们可能会遇到这个问题。

通常,在允许用户在数据库中创建表后,您不必专门定义他们有权在 SCHEMA 中执行此操作,因为public这是默认的。

在 PostgreSQL 15 中,这种情况发生了变化(来源):

PostgreSQL 15 还撤销了除公共(或默认)模式中的数据库所有者之外的所有用户的 CREATE 权限。

因此会出现以下错误:

ERROR: permission denied for schema public

现在您的流程应如下所示:

CREATE DATABASE EXAMPLE_DB;
CREATE USER EXAMPLE_USER WITH ENCRYPTED PASSWORD 'Sup3rS3cret';
GRANT ALL PRIVILEGES ON DATABASE EXAMPLE_DB TO EXAMPLE_USER;
\c EXAMPLE_DB postgres
# You are now connected to database "EXAMPLE_DB" as user "postgres".
GRANT ALL ON SCHEMA public TO EXAMPLE_USER;
Run Code Online (Sandbox Code Playgroud)

显然,根据需要更改权限。

最后一步,我们明确告诉PostgreSQL 15 中引入了对其中的EXAMPLE_USER模式具有特权。publicEXAMPLE_DB

  • 这就是我的解决方案,我正在使用 PostgreSQL 15。谢谢! (4认同)
  • 如果您(@Hritik)谈论 SCHEMA 上的 GRANT,那么我认为不可以,您只能更改所连接的数据库对象的权限。这个答案进一步澄清了一点 https://dba.stackexchange.com/a/262015 (2认同)

Lau*_*lbe 30

如果您得到 的“权限被拒绝” public.complete_oncology,但 的“关系不存在” ,则只能意味着一件事:您对该架构complete_oncology没有权限。USAGEpublic

获取要运行的模式的所有者

GRANT USAGE ON SCHEMA public TO your_user;
Run Code Online (Sandbox Code Playgroud)

然后您应该能够看到该表。如果您仍然缺乏对表本身的权限,请让所有者SELECT也授予您对表的权限。


Fly*_*ngV 26

总而言之

更改数据库 my_database 所有者为 my_database_user;

理由: 最近进行了一些更改来提高 POSTGRES 的安全性,具体取决于数据库的创建方式和创建者。总而言之,现在您可能需要指定除了拥有权限之外,您还是数据库的所有者。

解决方案:更改数据库 my_database 所有者为 my_database_user;

  • 如果有用的话就点赞吧。看来这对 postgres 来说是一个突破性的改变 (2认同)