【问题标题】:Can't get permissions for relation no matter what无论如何都无法获得关系权限
【发布时间】:2017-07-21 19:45:58
【问题描述】:

我已经尝试了几乎所有方法来获取 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

我也试过了:

ALTER DATABASE mydb OWNER TO myuser;

当然还有重启。

【问题讨论】:

  • 在出现错误之前执行了什么命令?
  • 架构中的表是否为public?当您连接psql 时,您可以作为用户myuser 访问它吗?
  • 显而易见:mytable 在架构中是公开的吗?或者它可能在 search_path 上的不同模式中?
  • 它可能不在公共架构中。我怎么把它弄进去?当我执行\l 时,它是我从shell postgres 默认用户创建的数据库,我已经使用sudo su postgresql 进入...也不确定psql 中架构和数据库之间的区别...
  • 其实我的表是public.mytable 所以我相信它在公共模式中。

标签: postgresql


【解决方案1】:

您是否在mydb 中分配了OWNER myuser? 这是解决问题的简单方法:

CREATE DATABASE mydb OWNER myuser;

【讨论】:

  • 没必要
【解决方案2】:

因此,根据this 的回答,我可以通过单独为一个表授予访问权限来获得访问权限,我想我将不得不对每个表进行访问。

仍然不确定为什么会这样。

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;

【讨论】:

  • 第一条语句会给你必要的权限。我怀疑您在创建表之前 发布了这些语句。那么第一条语句不会有任何影响,因为它只影响已经存在的表。但是第三条语句应该处理将来创建的表 - 除非发布它的用户与运行 CREATE TABLE 的用户不同(在这种情况下,您需要带有 FOR USER someuser 的子句运行CREATE TABLE 的用户)。这是我能想到的唯一解释。
  • 你的服务器是什么版本的 postgreSQL?
【解决方案3】:

ALTERT DEFAULT PRIVILEGES 似乎有一些变体。就我而言

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser;

没有工作。我还必须包含schema

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

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 2015-12-14
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    相关资源
    最近更新 更多