GAUSSDB-行级访问控制
【摘要】 功能描述(1)、对表创建行访问控制策略。(2)、对表创建行访问控制策略时,需打开该表的行访问控制开关(ALTER TABLE ... ENABLE ROW LEVEL SECURITY)策略才能生效,否则不生效。(3)、当前行访问控制会影响数据表的读取操作(SELECT、UPDATE、DELETE),暂不影响数据表的写入操作(INSERT、MERGE INTO)。表所有者或系统管理员可以在...
功能描述
(1)、对表创建行访问控制策略。
(2)、对表创建行访问控制策略时,需打开该表的行访问控制开关(ALTER TABLE ... ENABLE ROW LEVEL SECURITY)策略才能生效,否则不生效。
(3)、当前行访问控制会影响数据表的读取操作(SELECT、UPDATE、DELETE),暂不影响数据表的写入操作(INSERT、MERGE INTO)。表所有者或系统管理员可以在USING子句中创建表达式,并在客户端执行数据表读取操作时,数据库后台在查询重写阶段会将满足条件的表达式拼接并应用到执行计划中。针对数据表的每一条元组,当USING表达式返回TRUE时,元组对当前用户可见,当USING表达式返回FALSE或NULL时,元组对当前用户不可见。
(4)、行访问控制策略名称是针对表的,同一个数据表上不能有同名的行访问控制策略;对不同的数据表,可以有同名的行访问控制策略。
(5)、行访问控制策略可以应用到指定的操作(SELECT、UPDATE、DELETE、ALL),ALL表示会影响SELECT、UPDATE、DELETE三种操作;定义行访问控制策略时,若未指定受影响的相关操作,默认为ALL。
(6)、行访问控制策略可以应用到指定的用户(角色),也可应用到全部用户(PUBLIC);定义行访问控制策略时,若未指定受影响的用户,默认为PUBLIC。
语法格式
CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name
[ AS { PERMISSIVE | RESTRICTIVE } ]
[ FOR { ALL | SELECT | UPDATE | DELETE } ]
[ TO { role_name | PUBLIC } [, ...] ]
USING ( using_expression )
参数说明
policy_name
行访问控制策略名称,同一个数据表上行访问控制策略名称不能相同。
table_name
行访问控制策略的表名。
PERMISSIVE
指定行访问控制策略的类型为宽容性策略。对于一个给定的查询,将使用“OR”操作符将所有的宽容性策略组合。行访问控制策略的类型默认为宽容性策略。
RESTRICTIVE
指定行访问控制策略的类型为限制性策略。对于一个给定的查询,将使用“AND”操作符将所有的限制性策略组合。
须知:
至少需要一条宽容性策略允许对记录的访问。如果只有限制性策略存在,则不能访问任何记录。当宽容性和限制性策略共存时,只有当记录能通过至少一条宽容性策略以及所有的限制性策略时,该记录才能访问。
command
当前行访问控制影响的SQL操作,可指定操作包括:ALL、SELECT、UPDATE、DELETE。当未指定时,ALL为默认值,涵盖SELECT、UPDATE、DELETE操作。
当command为SELECT时,SELECT类操作受行访问控制的影响,只能查看到满足条件(using_expression返回值为TRUE)的元组数据,受影响的操作包括SELECT,UPDATE ... RETURNING,DELETE ... RETURNING。
当command为UPDATE时,UPDATE类操作受行访问控制的影响,只能更新满足条件(using_expression返回值为TRUE)的元组数据,受影响的操作包括UPDATE,UPDATE ... RETURNING,SELECT ... FOR UPDATE/SHARE。
当command为DELETE时,DELETE类操作受行访问控制的影响,只能删除满足条件(using_expression返回值为TRUE)的元组数据,受影响的操作包括DELETE,DELETE ... RETURNING。
role_name
行访问控制影响的数据库用户。
当未指定时,PUBLIC为默认值,PUBLIC表示影响所有数据库用户,可以指定多个受影响的数据库用户。
须知:
系统管理员不受行访问控制特性影响。
using_expression
行访问控制的表达式(返回boolean值)。
条件表达式中不能包含AGG函数和窗口(WINDOW)函数。在查询重写阶段,如果数据表的行访问控制开关打开,满足条件的表达式会添加到计划树中。针对数据表的每条元组,会进行表达式计算,只有表达式返回值为TRUE时,行数据对用户才可见(SELECT、UPDATE、DELETE);当表达式返回FALSE时,该元组对当前用户不可见,用户无法通过SELECT语句查看此元组,无法通过UPDATE语句更新此元组,无法通过DELETE语句删除此元组。
注意事项
(1)、支持对行存表、行存分区表、列存表、列存分区表、复制表、unlogged表、hash表定义行访问控制策略。
(2)、不支持HDFS表、外表、临时表定义行访问控制策略。
(3)、不支持对视图定义行访问控制策略。
(4)、同一张表上可以创建多个行访问控制策略,一张表最多创建100个行访问控制策略。
(5)、具有管理员权限的用户、初始运维用户(Ruby)、表的owner和表的owner角色组成员不受行访问控制影响,可以查看表的全量数据。
(6)、通过SQL语句、视图、函数、存储过程查询包含行访问控制策略的表,都会受影响。
(7)、不支持对行访问控制策略依赖的列进行类型修改。例如,不支持如下修改:
ALTER TABLE public.all_data ALTER COLUMN role TYPE text;
示例
打开all_data表的行访问控制策略开关
alter table all_data enable row level security;
创建行级访问控制策略,当前用户只能查看用户自身的数据
create row level security policy all_data_rls on all_data for select using(role = current_user);
查看策略相关信息
select * from pg_rlspolicies;
删除策略
drop row level security policy all_data_rls on all_data;
关闭行级访问策略
alter table all_data disable row level security;
创建行级访问控制策略bank_card_rls,要求crecard_mger用户只能查看信用卡信息,savcard_mger用户只能查看储蓄卡信息。
---不限制的别的用户可以看所有的. 建议第一个
方法1、
create row level security policy bank_card_rls on
bank_card for
select
to crecard_mger,
savcard_mger
using(b_type = case
when current_user = 'crecard_mger' then '信用卡'
when current_user = 'savcard_mger' then '储蓄卡'
end);
方法2、
create row level security policy bank_card_rls on
bank_card for
select
using(case
when current_user = 'crecard_mger' then b_type = '信用卡'
when current_user = 'savcard_mger' then b_type = '储蓄卡'
else true
end);
加一个行级访问控制u1只能看自己且年龄30以上
--修改rls_2策略
alter row level security policy rls_2 on t_user to u2 using(id=current_user);
--创建新策略
create row level security policy rls_3 on t_user for select to u1 using(id=current_user and age>30);
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)