VPD功能
VPD(Virtual Private Database),即虚拟私有数据库,用于实现数据库精细化权限管理。
Vastbase支持通过访问控制策略,实现对某个模式schema中的某个对象object(包括table或视图view)的访问控制。比如对模式TEST中的表T1的管理。
VPD功能的实现与内置包DBMS_RLS相关,且VPD的功能启用通过oracle_vpd_enabled参数控制。
添加访问控制策略
功能描述
通过添加管理策略功能可针对某个模式schema中的某个对象object(包括table或视图view)添加管理策略。比如对模式TEST中的表T1添加管理策略。
注意事项
添加访问控制策略满足以下要求:
- 支持的对象包括表和视图。
- 同一schema下的同一张表或视图可添加多个策略。
- 模式名称+对象名称+策略名称在全库中唯一。
- 生成谓词的函数应有两个输入参数:模式和表名或视图名。
- 添加策略后,应可通过数据字典查询已设置的管理策略以及上述各项指定的参数。
需依赖生成谓词的函数,如该函数不存在,则添加策略失败。
语法格式
dbms_rls.add_policy(
Object_name text,
policy_name text,
policy_function text,
object_schema text DEFAULT NULL::text,
function_schema text DEFAULT NULL::text,
statement_types text DEFAULT 'insert,update,delete,select'::text,
update_check boolean DEFAULT false,
enable boolean DEFAULT true,
sec_relevant_cols text DEFAULT NULL:text
) RETURN VOID
参数说明
Object_name text
对象名称
policy_name text
策略名称
policy_function text
策略函数名称
object_schema text DEFAULT NULL::text
对象模式,默认为空。
function_schema text DEFAULT NULL::text
函数模式,默认为空。
statement_types text DEFAULT 'insert,update,delete,select'::text
策略作用的语句类型,语句类型使用英文逗号分隔,默认为insert,update,delete,select。
update_check boolean DEFAULT false
是否启动更新检查,默认为false。
enable boolean DEFAULT true
是否启用策略。
sec_relevant_cols text DEFAULT NULL:text
敏感列,敏感列使用英文逗号分隔。
RETURN VOID
返回值为空。
删除访问控制策略
功能描述
通过模式名称、表名或视图名和策略名称,删除对应的管理策略。
注意事项
如删除时相应的策略不存在,则提示出错。
成功删除后,数据字典中相应策略信息也被清除。
语法格式
dbms_rls.drop_policy(
object_name text,
policy_name text,
object_schema text DEFAULT NULL:text
) RETURN VOID
参数说明
Object_name text
对象名称
policy_name text
策略名称
object_schema text DEFAULT NULL::text
对象模式,默认为空。
RETURN VOID
返回值为空。
启用/禁用访问控制策略
功能描述
启用或禁用访问控制策略。
当enable为=true时,表示已失效的策略生效。
当enable为=false时,表示使失效的策略生效。
语法格式
dbms_rls.enable_policy(
object_name text,
policy_name text,
enable boolean,
object_schema text DEFAULT NULL:text
) RETURN VOID
参数说明
Object_name text
对象名称
policy_name text
策略名称
enable boolean
启用或禁用访问控制策略。
取值范围:布尔值
true:启用访问控制策略。
false:禁用访问控制策略。
object_schema text DEFAULT NULL::text
对象模式,默认为空。
RETURN VOID
返回值为空。
行级访问控制
功能描述
在执行DML操作时,根据配置的策略执行相应的处理。
列级访问控制
功能描述
在执行DML操作时,根据配置的列级访问策略执行相应的处理。
示例
1、创建并设置模式为vpd。
create schema vpd;
set search_path to vpd;
2、创建测试表并插入数据。
create table t_vpd (x number);
insert into t_vpd values (1);
insert into t_vpd values (2);
insert into t_vpd values (10001);
insert into t_vpd values (10002);
3、创建测试函数。
CREATE OR REPLACE FUNCTION vpd.f_limited_query_t(s_schema IN text,s_object IN text)
RETURNS text AS $$
BEGIN
RETURN 'x <= 10000';
END;
$$ LANGUAGE plpgsql;
4、添加策略。
BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'vpd',
object_name => 't_vpd',
policy_name => 'policy_t_vpd_select',
function_schema => 'vpd',
policy_function => 'f_limited_query_t',
statement_types => 'select'
);
END;
/
5、启用策略。
BEGIN
DBMS_RLS.enable_policy(
object_schema => 'vpd',
object_name => 't_vpd',
policy_name => 'policy_t_vpd_select',
enable => true
);
END;
/
6、查看执行计划。
explain (COSTS false) select * from t_vpd;
结果返回为如下:
QUERY PLAN
---------------------------------
Seq Scan on t_vpd
(2 rows)