所以我正在制作这个应用程序,我正在使用 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
然后我很好地从表中选择了数据,但是当我尝试使用它访问它时,出现错误:psql postgres://meal:123@localhost:5432/food
food=> select * from foods;
ERROR: permission denied for relation foods
最佳答案
您在创建表之前授予权限。
由于当时没有 table ,所以什么都不会被授予。您创建的表不属于用户 meal
而属于用户 rawan95
(\c
命令告诉您)。
另外:授予对数据库的“所有权限”,不授予任何选择权限。 As documented in the manual “所有权限”是:CREATE、CONNECT、TEMPORARY、TEMP。 CREATE 权限将允许用户 meal
在该数据库中创建表。
如果您希望所有这些表都由用户 meal
拥有,您需要在以用户 meal
身份连接后运行设置脚本> (\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;
alter default privileges
仅对之后创建的表有效。因此,要修复您当前的设置,您需要首先授予对现有表的选择权限,然后更改将来创建的所有表的默认权限。
关于postgresql - 关系 <table_name> 的权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57452427/