PostgreSQL 中的关系权限被拒绝

问题描述 投票:0回答:13

我尝试运行简单的 SQL 命令:

SELECT * FROM site_adzone;

我收到了这个错误:

错误:关系 site_adzone 的权限被拒绝

这可能是什么问题?

我也尝试对其他表进行选择,但遇到了同样的问题。我也尝试这样做:

GRANT ALL PRIVILEGES ON DATABASE jerry TO tom;

但是我从控制台得到了这个响应:

警告:没有授予“jerry”任何权限

有人知道可能出了什么问题吗?

database postgresql privileges postgresql-9.2 sql-grant
13个回答
542
投票

数据库上的 GRANT 不是您所需要的。直接在桌子上授予。

授予数据库权限主要用于授予或撤销连接权限。这允许您指定谁可以在数据库中执行操作(如果他们有足够的其他权限)。

您想要的是:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

这将解决这个问题。


353
投票

发布 Ron E 的答案,以获得所有表上的授予权限,因为它可能对其他人有用。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

133
投票

先连接到正确的数据库,然后运行:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

97
投票
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;

51
投票

第一步也是重要步骤是连接到您的数据库:

psql -d yourDBName

第2步,授予权限

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;

30
投票

要向架构中的所有现有表授予权限,请使用:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

要指定将应用于未来表的默认权限,请使用:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

例如

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

如果您使用

SERIAL
BIGSERIAL
列,那么您可能需要对
SEQUENCES
执行相同的操作,否则您的
INSERT
将失败(Postgres 10 的
IDENTITY
不会遇到该问题,并推荐使用
SERIAL
类型),即

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

另请参阅我对Web App 的 PostgreSQL 权限的回答,了解更多详细信息和可重用脚本。

参考:

授予

更改默认权限


18
投票

当您以 postgres 用户身份创建表,然后尝试以普通用户身份访问它时,经常会发生这种情况。 在这种情况下,最好以 postgres 用户身份登录并使用以下命令更改表的所有权:

alter table <TABLE> owner to <USER>;

8
投票

确保您以表所有者的身份登录 psql。 要找出谁拥有这些桌子,请使用

\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

然后你就可以运行GRANTS


7
投票

你应该:

  1. 使用 DBeaver 连接到数据库,用户为 postgres
  2. 在左侧选项卡上打开您的数据库
  3. 打开“角色”选项卡/下拉菜单
  4. 选择您的用户
  5. 在右侧选项卡上按“权限选项卡”
  6. 按您的架构选项卡
  7. 按表格选项卡/下拉菜单
  8. 选择所有表格
  9. 选择所有必需的权限复选框(或按全部授予)
  10. 按保存

2
投票

当您正在寻找选择权限时,我建议您仅授予选择权限而不是所有权限。您可以通过以下方式执行此操作:

GRANT SELECT ON <table> TO <role>;

2
投票

对于 PostgreSQL。在 bash 终端上运行:

psql db_name -c "GRANT ALL ON ALL TABLES IN SCHEMA public to db_user;"
psql db_name -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to db_user;"
psql db_name -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to db_user;"

1
投票

我在将一个用户切换到另一个也需要具有相同权限的用户后遇到了这个问题,我不断收到错误:“必须是关系 xx 的所有者”

修复方法是简单地将所有权限从旧用户授予新用户:

postgres-# Grant <old user> to <new user>;


0
投票

例如,您可以使用

GRANT 语句
允许用户
john
person 表上执行所有操作,如下所示:

GRANT ALL PRIVILEGES ON TABLE person TO john;

或者:

GRANT ALL /* PRIVILEGES */ ON TABLE person TO john;

并且,您可以允许用户

john
使用
public
语句对
GRANT
模式中的所有表执行所有操作,如下所示:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO john;

或者:

GRANT ALL /* PRIVILEGES */ ON ALL TABLES IN SCHEMA public TO john;

*备注:

  • 您必须使用任何超级用户登录(例如,

    postgres
    )。

  • 您可以省略

    PRIVILEGES
    ,这是可选的。

© www.soinside.com 2019 - 2024. All rights reserved.