关系<table_name>

时间:2019-08-11 18:13:09

标签: postgresql privileges

因此,我正在制作此应用程序,并且正在使用Postgres,并且已经创建了一个数据库,一个用户和一个密码,并将该数据库上的所有特权授予了我创建的用户。

问题是,当我使用\c <database_name>在psql中切换数据库时,就可以使用查询了。

但是,当我在终端上使用psql运行postgres://user_name:password@localhost:5432/databasename并尝试select * from the <table_name>时,会显示此消息

  

关系

的权限被拒绝

您能告诉我该怎么做吗,我以前遇到过这个问题,因此我不得不创建另一个数据库或更改用户,但是我想要一个更好的解决方案。

PS:我尝试使用它:

GRANT ALL PRIVILEGES ON TABLE <table_name> to <user_name>

这是我创建和访问数据库的方式:

rawan95=# create database food ;
CREATE DATABASE

rawan95=# create user meal with password '123';
CREATE ROLE

rawan95=# grant all privileges on database food to meal;
GRANT

rawan95=# \c food
You are now connected to database "food" as user "rawan95".

之后,我使用

构建了它
food=# \i src/database/db_build.sql
BEGIN  
DROP TABLE  
CREATE TABLE  
INSERT 0 1  
COMMIT

然后我从表中选择数据就很好了,但是当我尝试使用它访问数据时,出现错误:psql postgres://meal:123@localhost:5432/food

food=> select * from foods;

ERROR:  permission denied for relation foods

2 个答案:

答案 0 :(得分:1)

您是否已授予使用模式的权限?否则,表权限将毫无用处。

GRANT USAGE ON SCHEMA schema_name TO username

编辑:基于下面的注释主题,我们建立了。 该表处于公共模式。 该表属于rawan95,但该模式不属于该模式(公共模式属于root postgres用户)。 OP尝试以用户“餐”的身份连接和访问表,他们已经使用rawan95用户授予了表权限,但无法授予架构权限。

从以上所述,问题可能仍然是用户“餐”在公共架构上没有使用。如果您使用的是Linux,最快的排序方法是切换到超级用户以从终端进行此更改:

sudo -u postgres psql -c "GRANT USAGE ON SCHEMA public TO meal"

进一步编辑-阅读您的新说明是不正确的(或至少没有用)。正如其他答复者所指出的那样,该问题是您获得赠款时没有表格。

答案 1 :(得分:1)

您将在创建表之前授予 特权。 由于当时没有表,因此不授予任何权限。您创建的表不是用户meal而是用户rawan95所拥有(\c命令告诉您)。

Plus:授予数据库“所有特权”,不授予任何选择特权。 As documented in the manual“所有特权”是:CREATE,CONNECT,TEMPORARY,TEMP。 CREATE特权将允许用户meal在该数据库中创建表。

如果您希望所有这些表都由用户meal 拥有,则需要以用户meal({{1 }}命令未更改当前用户)

如果您确实希望\c成为表的所有者,则需要在创建所有表后 授予选择特权:

rawan95

或者,您可以在创建表之前(在运行grant select on all tables in schema public to meal; 之前,更改默认权限 ),以便将来将它们应用于所有表:

db_build.sql

alter default privileges in schema public grant select on all tables to meal; 仅对在之后创建的表有效。因此,要修复您当前的设置,您需要首先在现有表上授予select权限,然后更改将来创建的所有表的默认特权。