# 权限与用户管理

URL: https://caijiao.org/postgresql/performance/maintenance/user
Source: docs/postgresql/performance/maintenance/user.md
Description: 本章节介绍 PostgreSQL 中的权限管理和用户管理，包括创建用户、赋予权限、角色管理等内容。

在 PostgreSQL 中，权限和用户管理是数据库安全性的重要组成部分。通过合理的权限配置，可以确保只有授权用户才能访问和操作数据库中的数据和对象。本文将介绍如何创建用户、赋予权限、管理角色等操作。

## 用户管理

### 1. 创建用户

在 PostgreSQL 中，用户是指拥有数据库访问权限的身份。用户可以是数据库管理员或普通用户。可以使用 `CREATE USER` 或 `CREATE ROLE` 命令来创建用户。

#### 创建用户的语法：

```sql
-- 创建一个用户
CREATE USER username WITH PASSWORD 'password';
````

#### 示例：

```sql
-- 创建一个名为 admin 的用户，并设置密码
CREATE USER admin WITH PASSWORD 'admin123';
```

### 2. 删除用户

可以使用 `DROP USER` 或 `DROP ROLE` 命令删除用户。

#### 删除用户的语法：

```sql
-- 删除一个用户
DROP USER username;
```

#### 示例：

```sql
-- 删除名为 admin 的用户
DROP USER admin;
```

### 3. 修改用户

可以通过 `ALTER USER` 命令修改用户的属性，如更改密码、赋予角色等。

#### 修改用户的语法：

```sql
-- 修改用户密码
ALTER USER username WITH PASSWORD 'new_password';

-- 为用户分配角色
ALTER USER username WITH ROLE role_name;
```

#### 示例：

```sql
-- 更改 admin 用户的密码
ALTER USER admin WITH PASSWORD 'new_password';
```

## 角色管理

### 1. 创建角色

PostgreSQL 中的角色可以是用户，也可以是权限的集合。角色可以拥有其他角色的权限，角色的创建通常用于组织权限控制。

#### 创建角色的语法：

```sql
-- 创建一个角色
CREATE ROLE role_name;
```

#### 示例：

```sql
-- 创建一个只读角色
CREATE ROLE readonly;
```

### 2. 为角色赋予权限

可以通过 `GRANT` 命令为角色赋予权限。权限可以是访问某些数据库对象的权限，如表、视图、函数等。

#### 赋予权限的语法：

```sql
-- 赋予角色查询权限
GRANT SELECT ON table_name TO role_name;

-- 赋予角色所有权限
GRANT ALL PRIVILEGES ON table_name TO role_name;
```

#### 示例：

```sql
-- 赋予 readonly 角色对 employees 表的查询权限
GRANT SELECT ON employees TO readonly;
```

### 3. 角色继承

在 PostgreSQL 中，角色可以继承其他角色的权限。通过继承，可以减少重复的权限配置。

#### 角色继承的语法：

```sql
-- 使一个角色继承另一个角色的权限
ALTER ROLE role_name INHERIT;
```

#### 示例：

```sql
-- 使 readonly 角色继承 admin 角色的权限
ALTER ROLE readonly INHERIT;
```

### 4. 角色的权限管理

可以为角色设置是否能够登录、是否能够创建数据库等属性。

#### 设置角色属性的语法：

```sql
-- 设置角色为可以登录
ALTER ROLE role_name LOGIN;

-- 设置角色为不能登录
ALTER ROLE role_name NOLOGIN;

-- 设置角色为超级用户
ALTER ROLE role_name SUPERUSER;
```

#### 示例：

```sql
-- 将 admin 角色设置为超级用户
ALTER ROLE admin SUPERUSER;
```

## 权限管理

### 1. 数据库权限

数据库权限控制用户是否能够连接数据库，以及是否能够执行某些操作（如创建表、删除表等）。可以使用 `GRANT` 和 `REVOKE` 命令进行权限管理。

#### 数据库权限的语法：

```sql
-- 赋予用户连接数据库的权限
GRANT CONNECT ON DATABASE database_name TO username;

-- 取消用户连接数据库的权限
REVOKE CONNECT ON DATABASE database_name FROM username;
```

#### 示例：

```sql
-- 允许 admin 用户连接到 database_name 数据库
GRANT CONNECT ON DATABASE database_name TO admin;
```

### 2. 表权限

表权限控制用户对数据库表的访问和操作。可以赋予用户查询、插入、更新、删除等权限。

#### 表权限的语法：

```sql
-- 赋予用户查询表的权限
GRANT SELECT ON table_name TO username;

-- 赋予用户插入数据的权限
GRANT INSERT ON table_name TO username;

-- 取消用户的查询权限
REVOKE SELECT ON table_name FROM username;
```

#### 示例：

```sql
-- 允许 admin 用户对 employees 表执行查询和插入操作
GRANT SELECT, INSERT ON employees TO admin;
```

### 3. 库对象权限

除了表之外，PostgreSQL 还支持对其他数据库对象（如视图、序列、函数）进行权限控制。管理这些对象的权限可以与表权限类似。

#### 示例：

```sql
-- 允许 admin 用户执行查询视图的操作
GRANT SELECT ON VIEW view_name TO admin;

-- 允许 admin 用户对序列进行操作
GRANT USAGE, SELECT ON SEQUENCE sequence_name TO admin;
```

## 特殊权限

### 1. 超级用户

超级用户是数据库管理员，拥有对所有数据库和对象的完全访问权限。使用超级用户可以执行任何操作，因此应谨慎分配超级用户权限。

#### 设置超级用户：

```sql
-- 设置角色为超级用户
ALTER ROLE role_name SUPERUSER;
```

### 2. 对数据库对象的控制权限

PostgreSQL 允许用户对数据库对象进行更细粒度的控制。比如，用户可以创建和删除数据库、模式、表空间等对象。

#### 赋予创建数据库的权限：

```sql
GRANT CREATE ON DATABASE database_name TO username;
```

## 小结

在 PostgreSQL 中，用户和权限管理是确保数据安全和数据库操作正常进行的基础。通过合理的角色和权限配置，可以有效地控制谁可以访问数据库、执行哪些操作。管理员应定期审查用户和权限设置，确保数据库的安全性和高效运行。
