Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Can';无论发生什么,都无法获取关系的权限_Postgresql - Fatal编程技术网

Postgresql Can';无论发生什么,都无法获取关系的权限

Postgresql Can';无论发生什么,都无法获取关系的权限,postgresql,Postgresql,我已经尽了一切努力为postgres中的某些关系获取用户权限。以下是我尝试过的: GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser; ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser; ALTER DEFAULT PRIVILEGES

我已经尽了一切努力为postgres中的某些关系获取用户权限。以下是我尝试过的:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myuser;
我已将我的pg_hba.cnf更改为:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            ident
#host    replication     postgres        ::1/128                 ident
我敢肯定,如果你正确地摆弄这些命令,它们一定会起作用,但是为什么这些命令中的任何一个都不能做任何接近它们所说的东西呢

我正在使用python:

>>> conn = psycopg2.connect(host="localhost", port="5432", dbname="mydb",user="myuser", password="mypassword")
>>> cur = conn.cursor()
>>> cur.execute('select count(*) from mytable')
这就是我得到的错误:

>>> cur.execute('select count(*) from public.mytable')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.ProgrammingError: permission denied for relation mytable

当然还有重新启动。

您是否在
mydb
中指定了所有者
myuser
? 这是解决问题的简单方法:

创建数据库mydb所有者myuser

因此,根据答案,我可以通过为一个表单独授予访问权限来获得访问权限,我想这将与每个表有关

仍然不知道为什么会这样

GRANT ALL PRIVILEGES ON TABLE mytable TO myuser;
但事实并非如此

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myuser;

似乎有一些
更改默认权限的变体。就我而言

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser;
没有工作。我还必须包括
模式

-- change PUBLIC to appropriate schema
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC GRANT ALL ON TABLES TO myuser;

在得到错误之前,您执行什么命令?架构中的表是公共的吗?当你连接到psql时,你能以user
myuser
的身份访问它吗?或者它可能位于搜索路径上的不同模式中?它可能不在公共模式中。我怎么才能把它弄进去?当我执行
\l
时,它是我从shell postgres默认用户创建的一个数据库,我让它进入
sudo su postgresql
。。。也不确定psql中模式和数据库之间的区别…实际上,我的表是public.mytable,所以我相信它在public模式中。这不是必需的第一条语句会给你必要的权限。我怀疑您在创建表之前发布了这些声明。那么第一条语句就没有任何效果,因为它只影响已经存在的表。但是第三条语句应该考虑将来创建的表——除非发布它的用户与运行
CREATE TABLE
的用户不同(在这种情况下,您需要为运行
CREATE TABLE
的用户someuser
使用子句
)。这是我能想到的唯一解释。你的服务器是什么版本的postgreSQL?
-- change PUBLIC to appropriate schema
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC GRANT ALL ON TABLES TO myuser;