目录
1、CREATE ROW LEVEL SECURITY POLICY语法
2、ALTER ROW LEVEL SECURITY POLICY语法
3、ROW LEVEL SECURITY策略与适配SQL语法关系
1)创建行访问控制策略,实现“学生自己只能查看自己的课程成绩”
2)修改行访问策略,实现“学生只能在8:00-18:00查看自己的成绩”
数据的安全性和隐私性变得越来越重要。行访问控制策略是数据库管理中的一种重要技术,可以保护数据的机密性和完整性。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 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)参数:
对已存在的行访问控制策略(包括行访问控制策略的名称,行访问控制指定的用户,行访问控制的策略表达式)进行修改。
1)语法:
--修改已存在行访问控制策略的名称
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)参数:
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中,行访问控制是数据库安全的重要组成部分。通过启用行级访问控制,可以限制数据库中的用户对特定数据的访问权限。以下是实现GaussDB行访问控制的一般步骤。
请注意,具体实现方法可能因GaussDB版本和配置环境而有所不同。因此,在实际操作中,建议参考GaussDB官方文档。
--创建用户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);
--查看表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
--切换用户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)
--切换用户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)
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”
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
通过本文的介绍,读者可以了解到GaussDB数据库表创建行访问控制策略的重要性和具体实现方法。行访问控制策略是一种有效的数据保护技术,可以防止未经授权的访问和恶意攻击,提高数据的安全性和可靠性。 在实际应用中,根据不同的业务需求和安全要求,可以灵活运用GaussDB提供的行访问控制策略功能,制定相应的安全策略,以保障数据的安全性和隐私性。
——结束