在宝塔面板里面先安装pgsql的管理器,然后在配置里面增加:
listen_addresses = '*'

增加下面一行:
host all all 0.0.0.0/0 md5如果连接上pgsql数据库之后,报错:
ERROR: permission denied for table channel_monitor_histories
这个报错已经说明 PostgreSQL 连接问题解决了,现在进入了数据库权限问题:
ERROR: permission denied for table channel_monitor_histories意思是:
当前连接的 PostgreSQL 用户没有 channel_monitor_histories 这个表的访问权限。
你现在登录的用户应该是:
sub2api但是这个表可能属于另一个用户(例如 postgres 或其他 owner)。
1. 先查看表属于谁
进入 PostgreSQL:
/www/server/pgsql/bin/psql -U postgres -d sub2api执行:
\dt channel_monitor_histories你会看到类似:
Schema | Name | Type | Owner
--------+------------------------+-------+--------
public | channel_monitor_histories | table | postgres如果 Owner 是:
postgres而你程序使用:
sub2api就会没有权限。
2. 直接给 sub2api 全库权限(推荐)
进入数据库:
/www/server/pgsql/bin/psql -U postgres执行:
GRANT ALL PRIVILEGES ON DATABASE sub2api TO sub2api;然后:
\c sub2api执行:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sub2api;再执行:
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO sub2api;3. 如果是 Sub2API 项目,建议直接改 owner
因为这类 Laravel / ThinkPHP 项目经常需要:
- select
- insert
- update
- delete
- sequence 自增
执行:
ALTER TABLE channel_monitor_histories OWNER TO sub2api;如果很多表都是 postgres:
可以一次性:
REASSIGN OWNED BY postgres TO sub2api;4. 新建表以后自动继承权限
避免以后迁移再次报错:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL ON TABLES TO sub2api;以及:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL ON SEQUENCES TO sub2api;5. 如果是宝塔导入数据库导致
宝塔导入 .sql 很容易出现:
表 owner = postgres
应用用户 = sub2api然后运行时报:
permission denied最简单修复:
/www/server/pgsql/bin/psql -U postgres -d sub2api执行:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sub2api;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO sub2api;你现在可以先执行:
\dt channel_monitor_histories把输出贴一下,我可以确认是不是 owner 不一致。这个和你刚才 Navicat 连接已经没有关系了,属于数据库权限。
postgres=# GRANT ALL PRIVILEGES ON DATABASE sub2api TO sub2api;
GRANT
postgres=# \c sub2api
You are now connected to database "sub2api" as user "postgres".
很好,现在已经进入正确方向了。
你执行:
GRANT ALL PRIVILEGES ON DATABASE sub2api TO sub2api;成功:
GRANT说明数据库级权限已经给了。
但是注意:
PostgreSQL 的数据库权限 ≠ 表权限
你现在还需要给 sub2api 用户下面这些权限,否则之前的:
permission denied for table channel_monitor_histories还会继续出现。
你现在已经在:
sub2api=# 执行下面:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sub2api;然后:
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO sub2api;再执行:
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO sub2api;然后建议直接修复 owner(Sub2API 这种项目更推荐):
查看当前表 owner:
\dt channel_monitor_histories大概率你会看到:
Owner
------
postgres如果是 postgres,执行:
ALTER TABLE channel_monitor_histories OWNER TO sub2api;如果这是整个 Sub2API 数据库都是 postgres 导入的,可以一次性改:
REASSIGN OWNED BY postgres TO sub2api;然后:
ALTER SCHEMA public OWNER TO sub2api;最后退出:
\q重启你的 Sub2API 服务。
为了确认权限是否完全正常,可以切换用户测试:
/www/server/pgsql/bin/psql -U sub2api -d sub2api进入后执行:
SELECT * FROM channel_monitor_histories LIMIT 1;如果能返回数据,权限问题就彻底解决。
另外提醒一下:如果这是宝塔迁移/恢复出来的 PostgreSQL,后续可能还会遇到:
permission denied for sequence xxx_id_seq所以 SEQUENCES 那条一定要执行。你现在直接把三条 GRANT 执行即可。










