我经历过numerous other posts(仅举几例),但仍然受阻。该配置非常简单,我将详细介绍所有内容,尽管我认为只有以下几个相关内容:
在Ubuntu 16.04上以用户{em> postgres 的身份运行psql
,我创建了具有以下3个表的数据库 qedadmin : networks ,< em>设备和设置;还有一个序列关系 networks_networkid_seq 由 networks.networkId 拥有。
我正在编写一个使用psycopg2在同一服务器上运行的python脚本,该脚本需要在 settings 表上执行SELECT
。许多示例都显示了脚本以用户' postgres '的身份进行连接,的确对我而言这是完美的。但是,我认为最好是使用特权较少的用户来进行这种事情,因此我用密码创建了用户 qedserver 。
在psycopg2连接字符串中使用这个新的用户名和密码以及localhost,我可以成功获得一个连接和一个游标(如果我使用不正确的用户名或密码值,则连接将失败,因此我知道已定义的用户名和密码以及来自python的身份验证全部正常)。但是,我在表 settings 上执行SELECT
语句的所有尝试均返回代码42501:关系设置的权限被拒绝。
我最初仅向用户 qedserver 授予SELECT
特权,并且仅授予表设置:
GRANT SELECT ON settings TO qedserver;
由于无效,我逐渐将特权提升到现在,用户 qedserver 在所有3个表,序列关系和数据库上都具有所有特权:
GRANT ALL PRIVILEGES ON settings TO qedserver;
GRANT ALL PRIVILEGES ON devices TO qedserver;
GRANT ALL PRIVILEGES ON networks TO qedserver;
GRANT ALL PRIVILEGES ON networks_networkid_seq TO qedserver;
GRANT ALL PRIVILEGES ON DATABASE qedadmin TO qedserver;
但是我仍然收到“权限设置被拒绝的权限”。
要清楚一点,将我的python脚本中的连接字符串仅从用户 postgres 的一个更改为用户 qedserver 的一个即可,因此成功与失败之间是有区别的,所以我我没有提供python代码,因为我认为这无关紧要(但如果您认为有帮助,我可以这样做)。
我想念什么?
编辑后添加:没有名为 qedserver 的linux用户;我认为没有必要,但也许我错了? (进一步编辑:我只是做了这个实验,没有任何区别。)
更新:通过@klin的评论和链接,我可以看到所有特权均已成功授予:qedserver在网络上具有特权arwdDxt
,设备和设置表,以及 networks_networkid_seq 序列关系的rwU
特权;和\l
在=Tc/postgres + postgres=CTc/postgres + qedserver=CTc/postgres
的 qedadmin 数据库上报告访问权限。
我还编辑了配置文件(系统上的/etc/postgresql/10/main/postgresql.conf)以设置log_error_verbosity = VERBOSE并将SIGHUP发送到postgresql进程以重新读取配置文件。对于每次失败的尝试,这都会在错误日志中添加另一行(在我的系统上为/var/log/postgresql/postgresql-10-main.log);现在日志显示了(新行是中间行):
qedserver@qedadmin ERROR: 42501: permission denied for relation settings
qedserver@qedadmin LOCATION: aclcheck_error, aclchk.c:3410
qedserver@qedadmin STATEMENT: SELECT * FROM settings WHERE deviceId = 10020;
我还能看什么或尝试取得进展吗?
编辑四个月后添加:所有这些都是针对新项目的,出于某些原因,我认为使用postgresql会更有利;在开发中这么早就遇到了这个问题,几天后又无法解决,我放弃了,转而使用mysql。这并不是OP的“解决方案”,因此我没有将其作为答案...