Windows系统下PostgreSQL默认角色设置及角色名称大小写问题求助
嘿,我来帮你理清楚这个问题的根源和解决办法~
首先你遇到的核心问题是PostgreSQL对标识符(角色、数据库名称)的大小写处理规则,以及psql默认登录角色的逻辑:
一、先搞清楚角色名称大小写的坑
PostgreSQL默认会把不带双引号的标识符自动转为小写。你当初执行的:
create user Mathe with password '123';
实际上创建的是名为mathe的小写角色,而不是你以为的大写Mathe——这就是为什么你直接运行psql(默认用当前Windows用户名Mathe,大写)时,会提示“role 'Mathe' does not exist”,因为数据库里根本没有这个大写角色,只有小写的mathe。
而且你之前尝试的重命名命令没执行成功,因为没加分号:
postgres=# ALTER ROLE "mathe" RENAME TO "Mathe"
PostgreSQL是分号作为命令结束标记的,没加分号的话命令不会提交,所以角色名根本没改过来,\du里看到的还是小写mathe。
二、解决你的两个核心需求
需求1:让psql默认用你创建的角色登录
psql在Windows上默认会使用当前Windows登录用户名作为默认角色名。要改默认角色,有两种简单方法:
方法1:设置环境变量(一劳永逸)
- 右键「此电脑」→ 属性 → 高级系统设置 → 环境变量
- 在「用户变量」里点击「新建」,变量名填
PGUSER,变量值填你要默认使用的角色名(比如mathe) - 重启命令提示符,之后直接敲
psql就会自动用mathe角色登录了
方法2:每次启动时指定参数
如果不想改环境变量,每次运行psql时明确指定角色和要连接的数据库:
psql -U mathe -d postgres
这里加-d postgres是因为PostgreSQL默认会尝试连接和角色同名的数据库,你没创建mathe数据库,所以得指定已存在的postgres数据库。
需求2:如果确实想要使用大写的Mathe角色
如果你坚持要大写的角色名,得按照PostgreSQL的规则正确创建:
- 先登录postgres超级用户,删除原来的小写角色:
DROP ROLE "mathe";
- 用双引号包裹角色名,创建大写的
Mathe角色(必须带双引号,否则又会被转小写):
CREATE ROLE "Mathe" WITH LOGIN PASSWORD '123';
- 同时创建和角色同名的数据库(这样直接运行psql时会自动连接这个数据库):
CREATE DATABASE "Mathe";
之后你直接运行psql,就会默认用大写的Mathe角色连接Mathe数据库了。
三、你之前尝试的ALTER命令为什么没效果?
你之前写的:
postgres-# ALTER ROLE Mathe postgres-# SET LOGIN = true postgres-# SET NOLOGIN = false
首先,这里的Mathe没加双引号,PostgreSQL会当成小写mathe;其次,命令没加分号,PostgreSQL一直处于等待输入的状态,根本没执行这些修改。正确的写法应该是:
ALTER ROLE "mathe" SET LOGIN = true;
不过其实你创建角色时默认就有LOGIN属性(用create user命令创建的角色默认带LOGIN,而create role需要显式加WITH LOGIN),所以这个修改其实没必要。
备注:内容来源于stack exchange,提问作者Hydroper

