在 PostgreSQL中查看有哪些用户和用户权限
在 PostgreSQL 中查看用户(在 PostgreSQL 中,用户和角色是同一个概念,ROLE
)主要有以下几种方法。
方法一:使用 SQL 命令查询系统目录(推荐)
这是最常用和最灵活的方法。用户信息主要存储在 pg_catalog.pg_roles
系统目录中。
1. 查看所有用户/角色(基本信息)
SELECT rolname AS username, rolsuper AS is_superuser,rolcanlogin AS can_login,rolcreatedb AS can_create_db,rolcreaterole AS can_create_roles,rolreplication AS can_do_replication
FROM pg_roles
ORDER BY rolname;
字段解释:
rolname
: 用户名。rolsuper
: 是否是超级用户(t
表示是,f
表示否)。rolcanlogin
: 是否有登录权限(即能否作为客户端连接数据库)。具有登录权限的角色才通常被称为“用户”。rolcreatedb
: 是否有创建数据库的权限。rolcreaterole
: 是否有创建其他角色的权限。rolreplication
: 是否有流复制的权限。
2. 仅查看具有登录权限的用户(常用)
我们通常更关心能登录数据库的用户。
SELECT usename AS username, usesuper AS is_superuser,usecreatedb AS can_create_db,usecreaterole AS can_create_roles,usesysid AS user_id
FROM pg_user
ORDER BY usename;
pg_user
是 pg_roles
的一个便于查看的视图,它默认只显示具有登录权限的角色。
3. 查看更详细的信息(包括权限、属性等)
SELECT * FROM pg_roles WHERE rolcanlogin = true ORDER BY rolname;
这会列出所有能登录的角色的所有属性,包括账户有效期、连接限制等。
方法二:使用元命令(在 psql 命令行工具中)
如果你正在使用 PostgreSQL 的交互式命令行工具 psql
,可以使用快捷的元命令(以反斜杠 \
开头的命令)。
1. 列出所有角色/用户
\du
或者更详细的版本:
\du+
\du
是 \df
用于函数,\dt
用于表一样,是用于用户的元命令。
2. 列出所有用户(等同于 SELECT * FROM pg_user;
)
\dg
在 PostgreSQL 中,\du
和 \dg
是等价的,都可以用来列出角色。
方法三:查看用户属性(如密码有效期、连接限制)
如果你想查看用户更具体的属性配置,可以查询 pg_shadow
系统目录。注意:通常只有超级用户才能查看此视图,因为它包含密码哈希(以md5
或SCRAM
形式加密存储)。
SELECT usename AS username,passwd AS password_hash, -- 敏感信息,通常以md5或SCRAM开头valuntil AS password_expires_at,useconfig AS session_defaults
FROM pg_shadow
WHERE usename = 'your_username'; -- 可以指定要查看的用户名
字段解释:
passwd
: 加密后的密码。如果是********
,则表示密码已被加密,无法直接查看明文。valuntil
: 密码失效时间(账户有效期)。useconfig
: 该用户会话的默认运行时配置(例如,{search_path=myschema, work_mem=16MB}
)。
示例输出解读
执行 \du
后,你可能会看到如下结果:
List of rolesRole name | Attributes | Member of
-----------+------------------------------------------------------------+-----------admin | Superuser, Create role, Create DB, Replication, Bypass RLS | {}app_user | Create DB | {readonly_group}bob | Password valid until 2024-12-31 | {}readonly | Cannot login | {}
- admin: 这是一个超级用户,拥有所有最高权限。
- app_user: 这是一个普通用户,拥有创建数据库的权限,并且是
readonly_group
角色的成员。 - bob: 这是一个普通用户,他的密码将在 2024 年底失效。
- readonly: 这是一个角色(
Cannot login
),不能直接登录,通常被授予其他用户以实现权限分组。
总结
你的需求 | 使用的命令(SQL) | 使用的元命令(psql 中) |
---|---|---|
快速查看所有用户及其主要权限 | SELECT * FROM pg_user; | \du 或 \dg |
查看所有角色(包括不能登录的) | SELECT rolname, rolcanlogin FROM pg_roles; | \du |
查看更详细的角色属性 | SELECT * FROM pg_roles; | \du+ |
查看用户的密码和有效期(需超级用户) | SELECT * FROM pg_shadow; | 无直接元命令 |
对于日常管理,最常用的是 \du
元命令,因为它简单快捷。在脚本或需要程序化处理时,则使用 SELECT ... FROM pg_roles
或 pg_user
的 SQL 查询方式。