我正在尝试在 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
我的权限不够吗?如果是,我如何授予自己查看该表的权限?我可以看到 AACT 数据库中不同模式的其他表。我读过一些用户建议通过以下方式授予自己权限,但没有运气:
GRANT SELECT ON complete_oncology TO PUBLIC
这只会出现一个错误:
ERROR: relation "complete_oncology" does not exist
SQL state: 42P01
在 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;
显然可以根据需要更改权限。
最后一步,我们明确告诉
EXAMPLE_USER
对 public
中的模式 EXAMPLE_DB
具有特权,这是在 PostgreSQL 15 中引入的。
如果您收到
public.complete_oncology
的“权限被拒绝”,但 oncology
的“关系不存在”,则只能意味着一件事:您对 USAGE
架构没有 public
权限。
获取要运行的架构的所有者
GRANT USAGE ON SCHEMA public TO your_user;
然后您应该能够看到该表。如果您仍然缺乏对表本身的权限,请让所有者也授予您对表的
SELECT
权限。
TLDR:
将数据库 my_database 所有者更改为 my_database_user;
理由: 最近进行了一些更改来提高 POSTGRES 的安全性,具体取决于数据库的创建方式和创建者。总而言之,现在您可能需要指定除了拥有权限之外,您还是数据库的所有者。
解决方案: 将数据库 my_database 所有者更改为 my_database_user;