关系表的访问权限被拒绝

446

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

select * from site_adzone;

并且我收到了这个错误:

ERROR: permission denied for relation site_adzone

这可能是什么问题?

我还尝试查询其他表,但是遇到了同样的问题。我也尝试了这个:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

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

警告:未授予"jerry"任何权限。

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


我不确定如何更新权限以便在数据库中进行读写。 - Bob
1
您需要授予必要的权限:http://www.postgresql.org/docs/current/static/ddl-priv.html 和 http://www.postgresql.org/docs/current/static/sql-grant.html - user330315
3
欢迎来到SO!对于这个问题,您可能会在dba.stackexchange.com上获得更多帮助,尽管您可能会发现同样有很多讽刺的评论 :) - Jared Beck
28
对不起。今晚我看到两个与编程有关的postgresql问题都被关闭了!上一个问题有67,000次浏览,这一个有30,000次浏览。我们应该设立一个流行度条款:任何非主观性问题,且浏览量大于15,000次 = 不属于离题范畴。 - Theodore R. Smith
1
这个问题并不是离题的!但它是一个重复的问题,链接为https://dev59.com/LWYr5IYBdhLWcg3wqr7o。 - wheaties
12个回答

542

授予数据库上的权限并不是你所需要的。应该直接在表上授权。

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

您实际想要的是:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

这将解决这个问题。


12
以超级用户身份运行它,就像postgres一样。 - Chris Travers
23
有没有什么捷径可以用来实现这个?GRANT ALL PRIVILEGES ON ALL TABLES? - Shadur
240
将所有表的权限授予jerry用户在public模式下: GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry; - Ron E
12
@RonE 这是否仅限于当前数据库? - Shadur
8
@zmiftah,为了创建模式,您需要执行以下操作:GRANT ALL PRIVILEGES ON SCHEMA nameSchema TO user; - Pierozi
显示剩余10条评论

350

发表Ron E的答案以授予对所有表的特权,因为它可能对他人有用。

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

36
您可能还需要针对“所有序列”和“所有函数”执行类似的命令。 - Pistos
16
对于那些想知道的人:全部表格(ALL TABLES)也包括视图,因此没有单独的全部视图(ALL VIEWS)命令 :-) - André Gasser
3
这可能是一个愚蠢的问题,但为什么简单地使用 GRANT ALL PRIVILEGES ON SCHEMA public TO jerry; 并不能在模式内部给予表的选择访问权限呢? - lollerskates

132

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

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

51
连接到正确的数据库会产生巨大的影响 :) \connect 数据库名; - Denis Matafonov
7
我一直连接的是"postgres"数据库。谢谢! - Andrew G.
3
连接到数据库是关键所在。 - inostia

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;

我确实这样做了,但是作为用户jerry尝试从模式public中选择表时仍然遇到权限被拒绝的问题... 真是令人烦恼! - syr

51

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

psql -d yourDBName

第二步,授予权限

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;

如果您使用SERIALBIGSERIAL列,则可能希望对SEQUENCES执行相同操作,否则您的INSERT将失败(Postgres 10的IDENTITY不会遇到该问题,并且建议使用SERIAL类型),即:
ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

请参考我的回答PostgreSQL Permissions for Web App,了解更多细节和可重用脚本。

参考:

GRANT

ALTER DEFAULT PRIVILEGES


以及 引用、截断、触发器 - Josh Hibschman
1
这个需要放得更高一些,这就是我成功的关键所在。通常的授权已经被执行了,但由于还没有任何表格存在,它并没有产生任何效果。也许这也是某个版本特有的问题。 - BuzZin'

18

当您以用户postgres创建表,然后尝试以普通用户访问该表时,经常会出现此问题。

在这种情况下,最好以postgres用户身份登录,并使用以下命令更改表的所有权:

alter table <TABLE> owner to <USER>;

非常好!知道这个真是痛苦,但这就是我最终做的事情。:D(捂脸) - ankush981

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. 选择所有所需的权限复选框(或按Grant All)
  10. 点击保存

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;"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接