创建用户和数据库
PostgreSQL 用户为以下类型:
-
postgresUNIX 系统用户 - 应该仅用于运行 PostgreSQL 服务器和客户端应用程序,如pg_dump。不要将postgres系统用户用于 PostgreSQL 管理的任何交互式工作,如数据库创建和用户管理。 -
数据库超级用户 - 默认的
postgresPostgreSQL 超级用户与postgres系统用户无关。可以在pg_hba.conf文件中限制postgres超级用户的权限,否则没有其他权限限制。也可以创建其他数据库超级用户。 -
具有特定数据库访问权限的角色:
- 数据库用户 - 默认具有登录权限
- 一组用户 - 启用整个组的管理权限
角色可以拥有数据库对象(如表和函数),并且可以使用 SQL 命令将对象特权分配给其他角色。
标准数据库管理特权包括 SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、EXECUTE 和 USAGE。
角色属性是特殊的特权,如 LOGIN、SUPERUSER、CREATEDB 和 CREATEROLE。
常见的做法是创建一个具有
CREATEDB和CREATEROLE特权的角色,并将此角色用于所有数据库和角色的日常管理。
- 以名为
postgres的系统用户登录
bash
su - postgres
psql
- 启动 PostgreSQL 互动终端
bash
psql
3.创建名为 mydbuser 的用户,并为 mydbuser 设置密码:
sql
CREATE USER mydbuser WITH PASSWORD 'mypasswd';
还可以在创建用户时为用户赋予相应权限,比如下面就为mydbuser赋予了创建数据库并管理用户索引的权限。
sql
CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB;
- 使用
\qmeta 命令从互动终端注销 - 注销
postgres用户会话
bash
logout
- 以
mydbuser用户身份登录 PostgreSQL 终端,指定主机名并连接到默认的postgres数据库,该数据库在初始化过程中创建
bash
psql -U mydbuser -h 127.0.0.1 -d postgres
7. 创建名为 `mydatabase` 的数据库:
```sql
CREATE DATABASE mydatabase;
- 使用
\qmeta 命令从互动终端注销 - 以
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 权限是独立但相关的,需要分别设置,但有一定的继承关系。
权限设置的基本原则
-
Schema 权限 ≠ Table 权限:授予 schema 的权限不会自动授予其中的表
-
双重权限控制:用户需要同时拥有:
- Schema 的
USAGE权限(访问 schema) - Table 的具体操作权限(SELECT/INSERT 等)
- Schema 的
具体关系说明
Schema 权限控制什么?
CREATE:允许在 schema 中创建新对象USAGE:允许访问 schema 中的对象(必要前提)- 不会自动授予对 schema 内现有表的任何操作权限
Table 权限控制什么?
- 具体的 DML 操作权限(SELECT, INSERT, UPDATE, DELETE 等)
- 即使有 schema 的 USAGE 权限,没有表权限仍然无法操作表
授予数据库连接权限
sql
GRANT CONNECT ON DATABASE mydb TO myuser;
授予 Schema 权限
- 授予 schema 的使用权限
sql
GRANT USAGE ON SCHEMA schema_name TO user_name;
- 授予 schema 中所有表的权限
sql
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA schema_name TO user_name;
- 授予未来创建表的默认权限
sql
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
授予 Table 权限
- 授予特定表的所有权限
sql
GRANT ALL PRIVILEGES ON TABLE table_name TO user_name;
- 授予特定表的特定权限
sql
GRANT SELECT, INSERT, UPDATE ON TABLE table_name TO user_name;
- 授予序列权限(如果有自增列)
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;