关系 <table_name> 的权限被拒绝

Permission denied for relation <table_name>

所以我正在制作这个应用程序,我正在使用 Postgres,我已经创建了一个数据库、一个用户和一个密码,并将数据库的所有权限授予我创建的用户。

问题是,当我使用 \c <database_name> 在 psql 中切换数据库时,我进入了很好的状态并且可以在其上使用查询。

但是当我 运行 psql 在终端上使用 postgres://user_name:password@localhost:5432/databasename 并尝试 select * from the <table_name> 它给了我这条消息

permission denied for relation <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

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

food=> select * from foods;

ERROR:  permission denied for relation foods

您是否已授予对架构的使用权?否则 table 权限将毫无用处。

GRANT USAGE ON SCHEMA schema_name TO username

编辑:基于下面的评论线程,我们已经建立。 table 在 public 架构中。 table 属于 rawan95 但模式不属于(public 模式属于 root postgres 用户)。 OP 正在尝试以用户 'meal' 的身份连接并访问 table 他们已使用 rawan95 用户授予 table 权限,但无法授予模式权限。

从上面来看,问题仍然可能是用户 'meal' 没有使用 public 架构。如果您在 Linux 上,最快的排序方法是切换到超级用户以从终端进行此更改:

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

进一步编辑 - 阅读您的新说明后,这是不正确的(或至少没有用)。正如其他回答者指出的那样,您在授予补助金时没有 table。

您在创建表之前授予权限。 由于当时没有桌子,所以什么都不会被授予。您创建的表不属于用户 meal,而是属于用户 rawan95\c 命令告诉您)。

另外:在数据库上授予 "all privileges",不会授予任何 select 权限。 As documented in the manual "all privileges" 是:创建、连接、临时、临时。 CREATE 权限将允许用户 meal 在该数据库中创建表。

如果您希望所有这些表都由用户拥有meal您需要运行您的设置脚本在您连接后作为用户meal\c命令没有改变当前用户)

如果您确实希望 rawan95 成为表的所有者,您需要在 创建所有表后授予 select 权限

grant select on all tables in schema public to meal;

或者,您可以更改默认权限 before 创建表(在 运行ning db_build.sql 之前),以便将它们应用于所有表未来:

alter default privileges in schema public
  grant select on all tables to meal;

alter default privileges 仅对在之后 创建的表有效。因此,要修复您当前的设置,您需要先对现有表授予 select,然后更改将来创建的所有表的默认权限。