查看用户权限 🔍
在 pgAdmin 的 Query Tool 中执行:
-- 查看所有用户及其权限
SELECT
rolname as "用户名",
rolsuper as "是否超级用户",
rolcreatedb as "可创建数据库",
rolcreaterole as "可创建角色"
FROM pg_roles
ORDER BY rolname;
或者在服务器终端:
# 以 postgres 用户身份登录
sudo -u postgres psql
# 查看用户列表
\du
验证超级管理员权限 🔍
执行这个查询来查看详细权限:
SELECT
rolname as "角色名",
rolsuper as "超级用户",
rolcreatedb as "可创建数据库",
rolcreaterole as "可创建角色",
rolcanlogin as "可登录"
FROM pg_roles
WHERE rolcanlogin = true -- 只显示可登录的用户
ORDER BY rolname;
或者使用更友好的显示:
SELECT
rolname as "用户名",
CASE WHEN rolsuper THEN '✅ 是' ELSE '❌ 否' END as "超级管理员",
CASE WHEN rolcreatedb THEN '✅ 是' ELSE '❌ 否' END as "可创建数据库",
CASE WHEN rolcreaterole THEN '✅ 是' ELSE '❌ 否' END as "可创建角色"
FROM pg_roles
WHERE rolcanlogin = true
ORDER BY rolsuper DESC, rolname;
查看当前用户 🙋
-- 查看当前登录的用户
SELECT current_user, session_user;
-- 查看是否是超级用户
SELECT usesuper FROM pg_user WHERE usename = current_user;出于安全考虑,建议为日常操作创建普通用户:
-- 创建普通用户
CREATE USER app_user WITH PASSWORD '密码123';
-- 创建数据库
CREATE DATABASE myapp_db OWNER app_user;
-- 赋予特定数据库的所有权限
GRANT ALL PRIVILEGES ON DATABASE myapp_db TO app_user;
-- 如果需要创建数据库的权限
ALTER USER app_user CREATEDB;
切换用户操作 🔄
在 pgAdmin 中切换用户:
方法 1: 添加新的服务器连接
使用不同的用户名连接同一个服务器
这样可以同时管理多个用户视角
方法 2: 在 Query Tool 中切换
-- 设置当前会话的用户角色
SET ROLE app_user;
-- 恢复到原用户
RESET ROLE;
在命令行切换用户:
# 以特定用户连接
psql -U app_user -d myapp_db
# 切换到 postgres 超级用户
sudo -u postgres psql创建新的管理员示例 👨💼
SQL 语法 ✅
-- 第1行:创建超级管理员
CREATE USER tl WITH SUPERUSER PASSWORD 'qweqwe123';
-- 第2行:创建普通管理员(注意是 CREATEDB 和 CREATEROLE,中间没有空格)
CREATE USER tt WITH CREATEDB CREATEROLE PASSWORD 'qweqwe123';
-- 第3行和第4行:创建只读用户并赋予权限
CREATE USER readonly WITH PASSWORD 'qweqwe123';
GRANT pg_read_all_data TO readonly;
逐句解析 📝
第1句:创建超级管理员
CREATE USER tl WITH SUPERUSER PASSWORD 'qweqwe123';
CREATE USER tl- 创建一个名为tl的用户WITH SUPERUSER- 赋予超级管理员权限(可以做任何事)PASSWORD 'qweqwe123'- 设置密码为qweqwe123
第2句:创建普通管理员
CREATE USER tt WITH CREATEDB CREATEROLE PASSWORD 'qweqwe123';
CREATEDB- 允许创建数据库CREATEROLE- 允许创建其他用户 / 角色但不是超级管理员,权限有限制
第3句:创建只读用户
CREATE USER readonly WITH PASSWORD 'qweqwe123';
创建一个名为
readonly的普通用户没有任何特殊权限
第4句:赋予只读权限(重点解析)⭐
GRANT pg_read_all_data TO readonly;
详细解释:
GRANT- SQL 的授权命令,意思是 "授予、赋予"pg_read_all_data- 这是 PostgreSQL 内置的预定义角色拥有这个角色的用户可以读取所有数据库中的所有表
但不能修改、删除、插入数据
只能
SELECT(查询)
TO readonly- 把这个角色赋予给readonly用户
相当于:
-- 把 readonly 用户加入到 pg_read_all_data 这个"权限组"
-- 类似于把一个人加入到"只读成员"群组
PostgreSQL 预定义角色说明 📚
实际应用场景 💼
-- 场景1: 数据分析师(只能查看,不能改)
CREATE USER analyst WITH PASSWORD 'pass123';
GRANT pg_read_all_data TO analyst;
-- 场景2: 应用程序用户(可以增删改查特定数据库)
CREATE USER app_user WITH PASSWORD 'pass123';
GRANT ALL PRIVILEGES ON DATABASE myapp TO app_user;
-- 场景3: 备份用户(只能读取,用于备份)
CREATE USER backup_user WITH PASSWORD 'pass123';
GRANT pg_read_all_data TO backup_user;
完整的用户权限管理示例 🎯
-- 1. 创建用户
CREATE USER john WITH PASSWORD 'secure_pass';
-- 2. 赋予预定义角色
GRANT pg_read_all_data TO john;
-- 3. 允许登录特定数据库
GRANT CONNECT ON DATABASE myapp TO john;
-- 4. 允许使用 public schema
GRANT USAGE ON SCHEMA public TO john;
-- 5. 查看用户的权限
SELECT
grantee,
privilege_type
FROM information_schema.role_table_grants
WHERE grantee = 'john';
权限回收(如果需要) 🔙
-- 撤销权限
REVOKE pg_read_all_data FROM readonly;
-- 删除用户
DROP USER readonly;