因此,我正在制作此应用程序,并且正在使用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
答案 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权限,然后更改将来创建的所有表的默认特权。