---
title: openGauss数据库权限管理模型（下）-官方技术文章-鲲鹏社区
description: 本文将重点介绍openGauss数据库高阶的权限管理机制，包括三权分立、列级访问控制以及行级访问控制。
keywords: Gauss,数据库权限管,理模型,官方技术文章,鲲鹏社区,三权分立,列级访问控制,行级访问控制
url: https://www.hikunpeng.com/developer/techArticles/20230912-12?envFlag=1
section: (其他)
---

# openGauss数据库权限管理模型（下）-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20230912-12?envFlag=1
描述: 本文将重点介绍openGauss数据库高阶的权限管理机制，包括三权分立、列级访问控制以及行级访问控制。
关键词: Gauss,数据库权限管,理模型,官方技术文章,鲲鹏社区,三权分立,列级访问控制,行级访问控制

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

openGauss数据库权限管理模型（下）

openGauss数据库权限管理模型（下）

实战经验

发表于 2021/08/02

0

openGauss数据库采用基于角色的权限访问控制模型，除了在openGauss数据库权限管理模型（上） [了解详情](http://mp.weixin.qq.com/s?__biz=MzIyMDE3ODk1Nw==&mid=2247494223&idx=1&sn=eecdbfc470aa84dc0d1f802665d59259&chksm=97cd552da0badc3b76d656da1ddf20092ea7f79a2752f10bc70108da9dc488717fe9e5457630&scene=21#wechat_redirect)中介绍的基本系统权限和对象权限的划分外，还有一些高阶的权限管理机制用来满足客户的业务诉求。

## 三权分立

三权分立是对系统权限管理机制的补充，核心思想是将管理数据库对象的权限、管理用户的权限和管理审计日志的权限分离，从而避免一个管理员拥有过度集中的权利带来的高风险。通过将GUC参数enableSeparationOfDuty设置为on来打开三权分立开关。

三权分立开关打开后， SYSADMIN的权限范围将缩小，不再包括允许创建用户/角色的权限，也不再包括允许查看、删除数据库审计日志的权限。SYSADMIN，CREATEROLE，AUDITADMIN三种系统权限的权限范围互相隔离，互不影响，而且一个用户仅能被赋予其中一个属性。

三权分立打开后的权限范围如下：

| 系统权限 | 权限范围 |
| --- | ---|
| SYSADMIN | 允许用户创建数据库，创建表空间 |
| CREATEROLE | 允许用户创建用户/角色 |
| AUDITADMIN | 允许用户查看、删除审计日志 |

## 列级访问控制

在一些业务场景中，数据表中的某些列存储了重要的信息，需要对用户不可见，但其他列的数据又需要用户能够查看或操作，此时就需要针对数据表的特定列做访问控制，实现针对用户的列级别的访问控制。

openGauss提供SQL语句GRANT/REVOKE实现针对列对象的权限授予和回收：

例1：将对表tbl的第一列(fir)进行select的权限和对表tbl的第二列(sec)进行update的权限授予用户user1

```
openGauss=# GRANT select(fir),update(sec) ON TABLE tbl TO user1;

GRANT
```

赋权后用户user1有权对tbl的第一列执行select操作和对第二列执行update操作

例2：撤销用户user1对表tbl的第一列fir进行select的权限

```
openGauss=# REVOKE select(fir) ON tbl FROM user1;

REVOKE
```

撤销后用户user1不再具有查看表tbl的第一列fir数据的权限

## 行级访问控制

在实际业务中还存在另外一种场景，同一张数据表，只允许用户查看满足特定条件的行数据，此时就需要将访问控制精确到数据表的行级别，使得不同用户执行相同的SQL查询、更新或删除操作，读取到的结果是不同的。

用户可以在数据表上创建行级访问控制(row level security)策略，该策略是针对特定数据库用户、特定SQL操作生效的表达式。当数据库用户访问数据表时，满足策略条件的行对用户可见，不满足条件的行对用户不可见，从而实现针对用户的行级别的访问控制。

openGauss提供SQL语句CREATE/ALTER/DROP ROW LEVEL SECURITY进行行级访问权限策略的创建/修改/删除操作：

步骤1：创建信息表pat_info记录医院病人的个人信息：

```
openGauss=# select * from pat_info;

patience | doctor | age

-----------+--------+-----

peter | mary | 25

bob | mary | 56

julie | tom | 38

(3 rows)
```

步骤2：创建行级访问控制策略，使得医生只能查看属于自己的病人信息：

```
openGauss=# CREATE ROW LEVEL SECURITY POLICY rls_select ON pat_info FOR select USING(doctor=current_user);

CREATE ROW LEVEL SECURITY POLICY
```

步骤3：打开信息表pat_info上的行级访问控制开关：

```
openGauss=# ALTER TABLE pat_info ENABLE ROW LEVEL SECURITY;

ALTER TABLE
```

步骤4：将信息表pat_info的查看权限赋予所有人：

```
openGauss=# grant select on table pat_info to public;

GRANT
```

步骤5：Mary医生的查看结果：

```
openGauss=> select * from pat_info; patience | doctor | age

----------+--------+-----

peter | mary | 25

bob | mary | 56

(2 rows)
```

步骤6：Tom医生的查看结果：

```
openGauss=> select * from pat_info; patience | doctor | age

----------+--------+-----

julie | tom | 38

(1 row)
```

本页内容
