PostgreSQL用户和权限的常用操作

创建用户和数据库

PostgreSQL 用户为以下类型:

  • postgres UNIX 系统用户 - 应该仅用于运行 PostgreSQL 服务器和客户端应用程序,如 pg_dump。不要将 postgres 系统用户用于 PostgreSQL 管理的任何交互式工作,如数据库创建和用户管理。

  • 数据库超级用户 - 默认的 postgres PostgreSQL 超级用户与 postgres 系统用户无关。可以在 pg_hba.conf 文件中限制 postgres 超级用户的权限,否则没有其他权限限制。也可以创建其他数据库超级用户。

  • 具有特定数据库访问权限的角色:

    • 数据库用户 - 默认具有登录权限
    • 一组用户 - 启用整个组的管理权限

角色可以拥有数据库对象(如表和函数),并且可以使用 SQL 命令将对象特权分配给其他角色。

标准数据库管理特权包括 SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGE

角色属性是特殊的特权,如 LOGINSUPERUSERCREATEDBCREATEROLE

常见的做法是创建一个具有 CREATEDBCREATEROLE 特权的角色,并将此角色用于所有数据库和角色的日常管理。

  1. 以名为 postgres 的系统用户登录
bash 复制代码
su - postgres

psql
  1. 启动 PostgreSQL 互动终端
bash 复制代码
psql

3.创建名为 mydbuser 的用户,并为 mydbuser 设置密码:

sql 复制代码
CREATE USER mydbuser WITH PASSWORD 'mypasswd';

还可以在创建用户时为用户赋予相应权限,比如下面就为mydbuser赋予了创建数据库并管理用户索引的权限。

sql 复制代码
CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB;
  1. 使用 \q meta 命令从互动终端注销
  2. 注销 postgres 用户会话
bash 复制代码
logout
  1. mydbuser 用户身份登录 PostgreSQL 终端,指定主机名并连接到默认的 postgres 数据库,该数据库在初始化过程中创建
bash 复制代码
psql -U mydbuser -h 127.0.0.1 -d postgres

7. 创建名为 `mydatabase` 的数据库:
```sql
CREATE DATABASE mydatabase;
  1. 使用 \q meta 命令从互动终端注销
  2. mydbuser 用户身份连接到 mydatabase
bash 复制代码
psql -U mydbuser -h 127.0.0.1 -d mydatabase

切换数据库也可以使用:\c mydatabase

创建 Schema

sql 复制代码
CREATE SCHEMA myschema AUTHORIZATION myuser;

如果不指定 AUTHORIZATION,默认所有者为当前用户。

将 Schema 所有权赋给其他用户:

sql 复制代码
ALTER SCHEMA myschema OWNER TO otheruser;

验证权限

sql 复制代码
-- 查看表权限
\z myschema.mytable

-- 查看用户权限
\du myuser

-- 查看 Schema 权限
\dn+ myschema

权限配置

在 PostgreSQL 中,schema 权限和 table 权限是独立但相关的,需要分别设置,但有一定的继承关系。

权限设置的基本原则

  1. Schema 权限 ≠ Table 权限:授予 schema 的权限不会自动授予其中的表

  2. 双重权限控制:用户需要同时拥有:

    • Schema 的 USAGE 权限(访问 schema)
    • Table 的具体操作权限(SELECT/INSERT 等)

具体关系说明

Schema 权限控制什么?

  • CREATE:允许在 schema 中创建新对象
  • USAGE:允许访问 schema 中的对象(必要前提)
  • 不会自动授予对 schema 内现有表的任何操作权限

Table 权限控制什么?

  • 具体的 DML 操作权限(SELECT, INSERT, UPDATE, DELETE 等)
  • 即使有 schema 的 USAGE 权限,没有表权限仍然无法操作表

授予数据库连接权限

sql 复制代码
GRANT CONNECT ON DATABASE mydb TO myuser;

授予 Schema 权限

  1. 授予 schema 的使用权限
sql 复制代码
GRANT USAGE ON SCHEMA schema_name TO user_name;
  1. 授予 schema 中所有表的权限
sql 复制代码
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA schema_name TO user_name;
  1. 授予未来创建表的默认权限
sql 复制代码
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

授予 Table 权限

  1. 授予特定表的所有权限
sql 复制代码
GRANT ALL PRIVILEGES ON TABLE table_name TO user_name;
  1. 授予特定表的特定权限
sql 复制代码
GRANT SELECT, INSERT, UPDATE ON TABLE table_name TO user_name;
  1. 授予序列权限(如果有自增列)
sql 复制代码
GRANT USAGE, SELECT ON SEQUENCE seq_name TO user_name;

常用权限类型

权限 说明
SELECT 查询数据
INSERT 插入数据
UPDATE 更新数据
DELETE 删除数据
TRUNCATE 清空表
REFERENCES 创建外键约束
TRIGGER 创建触发器
CREATE 在 schema 中创建对象
USAGE 使用 schema 或序列
ALL PRIVILEGES 所有权限

示例组合

sql 复制代码
-- 授予 schema 使用权限
GRANT USAGE ON SCHEMA public TO app_user;

-- 授予现有表的所有权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;

-- 设置默认权限,使未来创建的表自动有这些权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;

-- 授予序列权限
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE, SELECT ON SEQUENCES TO app_user;

查看已授予的权限

sql 复制代码
-- 查看 schema 权限
\dn+

-- 查看表权限
\dp schema_name.table_name

-- 查看用户权限
\du user_name

撤销权限

如果需要撤销权限,使用 REVOKE 命令:

sql 复制代码
REVOKE SELECT ON TABLE table_name FROM user_name;
相关推荐
auspicious航2 天前
PostgreSQL 高可用与负载均衡
数据库·postgresql
吴声子夜歌2 天前
PostgreSQL——表的基本操作
数据库·postgresql
kobe_OKOK_2 天前
查看ubuntu server 的基本信息
数据库·ubuntu·postgresql
~央千澈~3 天前
MongoDB 从3.4.0升级到4.0.0完整指南实战-优雅草蜻蜓I即时通讯水银版成功升级-卓伊凡|bigniu
数据库·postgresql
····懂···5 天前
抢占先机,PostgreSQL 中级专家认证的职业跃迁
数据库·postgresql
Full Stack Developme5 天前
PostgreSQL dblink 与 Spring Boot @Transactional 的事务整合
数据库·spring boot·postgresql
IvorySQL6 天前
PGSQL运维优化:提升vacuum执行时间观测能力
运维·postgresql·开源·开源数据库·ivorysql
阿明 -李明6 天前
银行账户风险防控数字化的应用与实践
大数据·postgresql·flink·kafka