200字
PostgreSQL 命令使用
2025-12-04
2025-12-04

查看用户权限 🔍

在 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;

详细解释

  1. GRANT - SQL 的授权命令,意思是 "授予、赋予"

  2. pg_read_all_data - 这是 PostgreSQL 内置的预定义角色

    • 拥有这个角色的用户可以读取所有数据库中的所有表

    • 不能修改、删除、插入数据

    • 只能 SELECT(查询)

  3. TO readonly - 把这个角色赋予给 readonly 用户

相当于

-- 把 readonly 用户加入到 pg_read_all_data 这个"权限组"
-- 类似于把一个人加入到"只读成员"群组

PostgreSQL 预定义角色说明 📚

角色名

权限说明

用途

pg_read_all_data

读取所有数据

👀 只读用户

pg_write_all_data

写入所有数据

✏️ 可修改数据

pg_read_all_settings

读取所有配置

⚙️ 查看系统设置

pg_monitor

监控数据库

📊 监控用户

实际应用场景 💼

-- 场景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;

评论