创建用户和数据库
PostgreSQL 用户为以下类型:
-
postgres
UNIX 系统用户 - 应该仅用于运行 PostgreSQL 服务器和客户端应用程序,如pg_dump
。不要将postgres
系统用户用于 PostgreSQL 管理的任何交互式工作,如数据库创建和用户管理。 -
数据库超级用户 - 默认的
postgres
PostgreSQL 超级用户与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;
- 使用
\q
meta 命令从互动终端注销 - 注销
postgres
用户会话
bash
logout
- 以
mydbuser
用户身份登录 PostgreSQL 终端,指定主机名并连接到默认的postgres
数据库,该数据库在初始化过程中创建
bash
psql -U mydbuser -h 127.0.0.1 -d postgres
7. 创建名为 `mydatabase` 的数据库:
```sql
CREATE DATABASE mydatabase;
- 使用
\q
meta 命令从互动终端注销 - 以
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;