GaussDB数据库表创建行访问控制策略

目录

++一、前言++

++二、GaussDB中的行访问控制++

++[1、CREATE ROW LEVEL SECURITY POLICY语法](#1、CREATE ROW LEVEL SECURITY POLICY语法)++

++[2、ALTER ROW LEVEL SECURITY POLICY语法](#2、ALTER ROW LEVEL SECURITY POLICY语法)++

++[3、ROW LEVEL SECURITY策略与适配SQL语法关系](#3、ROW LEVEL SECURITY策略与适配SQL语法关系)++

++三、GaussDB中的行访问控制策略示例++

++1、实现GaussDB行访问控制的一般步骤++

++2、行访问控制策略的创建与修改(示例)++

++1)创建行访问控制策略,实现"学生自己只能查看自己的课程成绩"++

++2)修改行访问策略,实现"学生只能在8:00-18:00查看自己的成绩"++

++四、注意事项++

++五、小结++

一、前言

数据的安全性和隐私性变得越来越重要。行访问控制策略是数据库管理中的一种重要技术,可以保护数据的机密性和完整性。GaussDB是一款高性能、高可用性的数据库管理系统,提供了丰富的安全功能,其中包括行访问控制策略。

本文将介绍GaussDB数据库表创建行访问控制策略的基本概念和操作方法,并通过实例演示其过程。通过介绍,读者可以了解GaussDB数据库表创建行访问控制策略的重要性和具体实现方法,为保障数据安全提供参考。

二、GaussDB中的行访问控制

一般默认情况下,表是没有行级安全策略限制的,要想使表具有行级安全性,要么在初始时就通过"CREATE ROW LEVEL SECURITY POLICY"创建、要么就在后期通过"ALTER ROW LEVEL SECURITY POLICY"修改。

在GaussDB中,行访问控制影响数据表的读取操作(例如:SELECT、UPDATE、DELETE等),暂不影响数据表的写入操作(例如:INSERT、MERGE INTO等)。

1、CREATE ROW LEVEL SECURITY POLICY语法

对表创建行访问控制策略。

1 )语法:

sql 复制代码
CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name
     [ AS { PERMISSIVE | RESTRICTIVE } ]
     [ FOR { ALL | SELECT | UPDATE | DELETE } ]
     [ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]
     USING ( using_expression )

2 )参数:

  • policy_name 行访问控制策略名称,同一个数据表上行访问控制策略名称不能相同。
  • table_name 行访问控制策略的表名。
  • PERMISSIVE 指定行访问控制策略为宽容性策略,条件用OR表达式拼接。
  • RESTRICTIVE 指定行访问控制策略为限制性策略,条件用AND表达式拼接。
  • role_name 行访问控制影响的数据库用户。(主要包含:CURRENT_USER、SESSION_USER等。当未指定时,默认为PUBLIC,表示影响所有数据库用户。可以指定多个受影响的数据库用户。系统管理员不受行访问控制特性影响)
  • using_expression 行访问控制的表达式(返回boolean值)。

2、ALTER ROW LEVEL SECURITY POLICY语法

对已存在的行访问控制策略(包括行访问控制策略的名称,行访问控制指定的用户,行访问控制的策略表达式)进行修改。

1 )语法:

sql 复制代码
--修改已存在行访问控制策略的名称
ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name RENAME TO new_policy_name;

--修改已存在行访问控制策略的指定用户、策略表达式
ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name
    [ TO { role_name | PUBLIC } [, ...] ]
    [ USING ( using_expression ) ];

2 )参数:

  • policy_name 行访问控制策略名称**。**
  • table_name 行访问控制策略的表名。
  • new_policy_name 新的行访问控制策略名称。
  • role_name 行访问控制策略应用的数据库用户,可以指定多个用户,PUBLIC表示应用到所有用户。
  • using_expression 行访问控制策略,形式类似于where子句中的布尔型表达式。

3、ROW LEVEL SECURITY策略与适配SQL语法关系

|-----------------------------|-----------------------|-----------------------|-----------------------|
| Command | SELECT/ALL policy | UPDATE/ALL policy | DELETE/ALL policy |
| SELECT | Existing row | No | No |
| SELECT FOR UPDATE/SHARE | Existing row | Existing row | No |
| UPDATE | No | Existing row | No |
| UPDATE RETURNING | Existing row | Existing row | No |
| DELETE | No | No | Existing row |
| DELETE RETURNING | Existing row | No | Existing row |

三、GaussDB中的行访问控制策略示例

1、实现GaussDB行访问控制的一般步骤

在GaussDB中,行访问控制是数据库安全的重要组成部分。通过启用行级访问控制,可以限制数据库中的用户对特定数据的访问权限。以下是实现GaussDB行访问控制的一般步骤。

请注意,具体实现方法可能因GaussDB版本和配置环境而有所不同。因此,在实际操作中,建议参考GaussDB官方文档。

2、行访问控制策略的创建与修改(示例)

1)创建行访问控制策略,实现"学生自己只能查看自己的课程成绩"。

sql 复制代码
--创建用户zhangsan、lisi (Password must contain at least three kinds of characters)
CREATE USER zhangsan PASSWORD 'zhangsan@123';
CREATE USER lisi PASSWORD 'lisi@123';


--创建数据表test_3。
CREATE TABLE test_3(
   id int
  ,name varchar(20)
  ,course varchar(20)
  ,score int 
);

--向数据表插入数据
INSERT INTO test_3 VALUES(1, 'zhangsan', '语文',90);
INSERT INTO test_3 VALUES(2, 'zhangsan', '数学',95);
INSERT INTO test_3 VALUES(3, 'zhangsan', '英语',85);
INSERT INTO test_3 VALUES(4, 'lisi', '语文',85);
INSERT INTO test_3 VALUES(5, 'lisi', '数学',90);
INSERT INTO test_3 VALUES(6, 'lisi', '英语',95);

--将表test_3的读取权限赋予zhangsan、lisi。
GRANT SELECT ON test_3 TO zhangsan,lisi;

--打开行访问控制策略开关。
ALTER TABLE test_3 ENABLE ROW LEVEL SECURITY;

--创建行访问控制策略,当前用户只能查看用户自己的数据。
CREATE ROW LEVEL SECURITY POLICY test_3_r 
ON test_3 
USING(name = CURRENT_USER);
sql 复制代码
--查看表test_3相关信息。通过元命令 "\d+  test_3"  或者通过系统表"PG_RLSPOLICY"
GaussDB=# \d+ test_3
                               Table "public.test_3"
 Column |         Type          | Modifiers | Storage  | Stats target | Description 
--------+-----------------------+-----------+----------+--------------+-------------
 id     | integer               |           | plain    |              | 
 name   | character varying(20) |           | extended |              | 
 course | character varying(20) |           | extended |              | 
 score  | integer               |           | plain    |              | 
Row Level Security Policies:
    POLICY "test_3_r" FOR ALL
      TO public
      USING (((name)::name = "current_user"()))
Has OIDs: no
Options: orientation=row, compression=no, enable_rowsecurity=true
sql 复制代码
--切换用户zhangsan进行SELECT操作
[omm@node1 root]$ gsql -d postgres -U zhangsan -p 26000 -ar

GaussDB=> SELECT * FROM test_3;
 id |   name   | course | score 
----+----------+--------+-------
  1 | zhangsan | 语文   |    90
  2 | zhangsan | 数学   |    95
  3 | zhangsan | 英语   |    85
(3 rows)
sql 复制代码
--切换用户lisi进行SELECT操作
[omm@node1 root]$ gsql -d postgres -U lisi -p 26000 -ar

GaussDB=> SELECT * FROM test_3;
 id | name | course | score 
----+------+--------+-------
  4 | lisi | 语文   |    85
  5 | lisi | 数学   |    90
  6 | lisi | 英语   |    95
(3 rows)

2)修改行访问策略,实现"学生只能在8:00-18:00查看自己的成绩"

sql 复制代码
ALTER ROW LEVEL SECURITY POLICY test_3_r
ON test_3 
USING (name = CURRENT_USER AND current_time >= TIME '08:00:00' AND current_time <= TIME '18:00:00');

--查看表test_3相关信息。通过元命令 "\d+ test_3" 或者通过系统表"PG_RLSPOLICY"

sql 复制代码
GaussDB=# \d+ test_3
                               Table "public.test_3"
 Column |         Type          | Modifiers | Storage  | Stats target | Description 
--------+-----------------------+-----------+----------+--------------+-------------
 id     | integer               |           | plain    |              | 
 name   | character varying(20) |           | extended |              | 
 course | character varying(20) |           | extended |              | 
 score  | integer               |           | plain    |              | 
Row Level Security Policies:
    POLICY "test_3_r" FOR ALL
      TO public
      USING (((((name)::name = "current_user"()) AND (('now'::text)::time with time zone >= ('08:00:00'::time without time zone)::time with time zone)) AND (('now'::text)::time with time zone <= ('18:00:00'::time without time zone)::time with time zone)))
Has OIDs: no
Options: orientation=row, compression=no, enable_rowsecurity=true

四、注意事项

  • 不支持外表、本地临时表、视图定义行访问控制策略。
  • 同一张表可以创建多个行访问控制策略。
  • 系统管理员不受行访问控制影响。
  • 不支持对添加了行级访问控制策略的表字段进行修改数据类型操作。
  • 行访问控制策略可以应用到指定的操作(SELECT、UPDATE、DELETE、ALL),ALL表示会影响SELECT、UPDATE、DELETE三种操作,默认为ALL。
  • 需要打开该表的行访问控制开关(ALTER TABLE ... ENABLE ROW LEVEL SECURITY),否则不生效。
  • 行访问控制策略名称是针对表的,同一个数据表上不能有同名的行访问控制策略;对不同的数据表,可以有同名的行访问控制策略。

五、小结

通过本文的介绍,读者可以了解到GaussDB数据库表创建行访问控制策略的重要性和具体实现方法。行访问控制策略是一种有效的数据保护技术,可以防止未经授权的访问和恶意攻击,提高数据的安全性和可靠性。 在实际应用中,根据不同的业务需求和安全要求,可以灵活运用GaussDB提供的行访问控制策略功能,制定相应的安全策略,以保障数据的安全性和隐私性。

------结束

相关推荐
eventer1231 小时前
KylinOS V10 SP3下编译openGauss与dolphin插件
gaussdb
一只淡水鱼662 小时前
【mybatis】详解 # 和 $ 的区别,两者分别适用于哪种场景,使用 $ 不当会造成什么影响
sql·spring·mybatis·sql注入
奔跑草-3 小时前
【数据库】SQL应该如何针对数据倾斜问题进行优化
数据库·后端·sql·ubuntu
HD2436088364 小时前
【mysql】id主键列乱了之后,重新排序(可根据日期顺序)
数据库·sql·mysql
憶巷6 小时前
MyBatis中动态SQL执行原理
java·sql·mybatis
知识的宝藏7 小时前
Django models中的增删改查与MySQL SQL的对应关系
sql·mysql·django·django models
Ahern_12 小时前
Oracle 普通表至分区表的分区交换
大数据·数据库·sql·oracle
m0_7482336413 小时前
SQL数组常用函数记录(Map篇)
java·数据库·sql
m0_748233881 天前
SQL语句整理五-StarRocks
数据库·sql
drebander1 天前
SQL 实战-巧用 CASE WHEN 实现条件分组与统计
大数据·数据库·sql