关联关系被拒绝


329

我试图运行简单的sql命令:

select * from site_adzone;

我得到这个错误

ERROR:  permission denied for relation site_adzone

这可能是什么问题?

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

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

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

WARNING:  no privileges were granted for "jerry"

您知道什么地方可能出问题吗?


我不确定如何更新权限,以便可以在数据库中进行读取/写入
Boban 2013年


2
欢迎来到SO!对于这个问题,尽管您可能会发现许多sn亵评论,但您可能会在dba.stackexchange.com上获得更多帮助:)
Jared Beck

10
劳驾。这是第二个与编程相关的postgresql问题,我今晚已将其关闭,成为题外话!最后一个观看了67,000次,其中一个观看了30,000次。我们应该有一个流行性条款:任何具有> 15,000的观点的非主观问题=主题。
Theodore R. Smith

1
这个问题不是题外话!但是,它是stackoverflow.com/questions/13497352/…
Wheaties

Answers:


391

不需要数据库上的GRANT。直接在表上授予。

授予数据库特权通常用于授予或撤销连接特权。这使您可以指定如果他们具有足够的其他权限,谁可以在数据库中执行操作。

您要改为:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

这将解决此问题。


7
以超级用户的身份运行它,例如postgres。
克里斯·特拉弗斯

19
可以以某种方式成为捷径吗?将所有特权授予所有表?
Shadur 2014年

196
@Shadur将SCHEMA中所有表上的所有特权授予jerry;
罗恩E

10
@RonE仅限于当前数据库吗?
Shadur 2014年

7
@zmiftah您需要的模式>将所有特权授予模式名称给用户;
Pierozi

241

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

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

21
您可能还需要为ALL SEQUENCES和执行类似的命令ALL FUNCTIONS
Pistos

7
只是对于那些谁不知道:ALL TABLES还包括意见,所以没有单独的ALL VIEWS命令:-)
安德烈·加塞尔

74

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

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

4
感谢连接到正确的数据库不是我以前做的!
asg 2009年

15
连接到正确的数据库会引起很大的\connect databasename;
麻烦

3
这个。我一直都与“ postgres”建立联系。谢谢!
Andrew G.

2
是的,与数据库的连接有所不同
inostia

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

这个答案拯救了我的一天!
anhtran

19

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

psql -d yourDBName

2个步骤,授予特权

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

18

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

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 10IDENTITY不受此问题的影响,建议在SERIAL类型上使用),即

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

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

参考:

格兰特

更改默认特权


9

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

alter table <TABLE> owner to <USER>;

5

确保以表的所有者身份登录psql。找出谁拥有表\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

那么你可以运行格兰特


0

在寻找选择权限时,建议您只授予选择权限,而不要授予所有权限。您可以通过以下方式做到这一点:

GRANT SELECT ON <table> TO <role>;

0

你应该:

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

-3

我曾经遇到这个问题。只需将数据库用户更改为超级用户即可解决您的问题。

使用SUPERUSER更改用户myuser;


这样,您授予的权限超出了您的需要。超级用户将给他们权限等操作你可能不希望用户做的,如创建其他用户,数据库等
桑蒂
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.