关系 <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,然后更改将来创建的所有表的默认权限。
所以我正在制作这个应用程序,我正在使用 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,然后更改将来创建的所有表的默认权限。