VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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)