VastbaseG100

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

Menu

DBMS_RLS

功能描述

Vastbase在Oracle兼容模式下支持内置包DBMS_RLS,该内置包包含细粒度的访问控制管理接口,用于实现虚拟专用数据库(VPD)。

注意事项

该功能仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。

子程序

Vastbase支持该内置包的如下函数:

函数 描述
add_policy 添加VPD策略。通过添加管理策略可针对某个模式schema中的某个对象(包括table、view)添加管理策略。
drop_policy 删除已存在的VPD策略。
enable_policy 禁用VPD策略或启用VPD策略。

add_policy

语法格式

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

    对象名称,类型为text。

  • policy_name

    策略名称,类型为text。

  • policy_function

    策略函数名称,类型为text。

    仅在V2.2 Build 10 (Patch No.11)及以后补丁版本,和V2.2 Build 13及以后版本中支持调用package函数。

  • object_schema

    对象模式。类型为text,默认为空。

  • function_schema

    函数模式。类型为text,默认为空。

  • statement_types

    策略作用的语句类型,类型为text,语句使用英文逗号分隔,默认为insert,update,delete,select

  • update_check

    是否启动更新检查。类型为boolean,默认为false。

  • enable

    是否启用策略。类型为boolean,默认为true。

  • sec_relevant_cols

    敏感列,敏感列使用英文逗号分隔。类型为text,默认值为空。

示例

1、修改策略参数。

alter system set oracle_vpd_enabled=true;

2、创建schema和搜索路径。

create schema SCOTT_1145109;
set search_path=SCOTT_1145109;

3、创建表EG_1145168。

CREATE TABLE EG_1145109(
ID NUMBER,
NAME VARCHAR2(20),
SALARY NUMBER
);

4、创建策略存储过程auth_pkg_1145109。

CREATE OR REPLACE PACKAGE auth_pkg_1145109 IS
FUNCTION auth_eg(p_schema IN VARCHAR2, p_object IN VARCHAR2)
RETURN VARCHAR2;
END auth_pkg_1145109;
/

CREATE OR REPLACE PACKAGE BODY auth_pkg_1145109 IS
FUNCTION auth_eg(p_schema IN VARCHAR2, p_object IN VARCHAR2)
RETURN VARCHAR2
IS
predict VARCHAR(100);  
BEGIN
predict := 'ID > 10'; 
RETURN predict; -- 只过滤ID>10的行
END;
END auth_pkg_1145109;
/

5、调用ADD_POLICY应用策略。

SELECT DBMS_RLS.ADD_POLICY(object_schema=>'SCOTT_1145109',
object_name=>'EG_1145109',
policy_name=>'EG_1145109_POLICY',
function_schema=>'SCOTT_1145109',
policy_function=>'auth_pkg_1145109.auth_eg',
statement_types=>'SELECT,UPDATE,DELETE,INSERT',
enable => TRUE);

6、查询DBA_POLICIES检查策略是否已添加。\x表示列式显示查询结果。

\x
SELECT * FROM DBA_POLICIES A WHERE A.POLICY_NAME='EG_1145109_POLICY';

结果返回为如下,表示已添加策略:

Expanded display is on.

-[ RECORD 1 ]----+------------------
object_owner     | VASTBASE
object_namespace | SCOTT_1145109
object_name      | EG_1145109
policy_group     | SYS_DEFAULT
policy_name      | EG_1145109_POLICY
pf_owner         | VASTBASE
pf_namespace     | SCOTT_1145109
package          | AUTH_PKG_1145109
function         | AUTH_EG
sel              | YES
ins              | YES
upd              | YES
del              | YES
idx              | NO
chk_option       | NO
enable           | YES
static_policy    | NO
policy_type      | DYNAMIC
long_predicate   | YES
common           | NO
inherited        | NO

7、向EG_1145109表表中插入数据并查询。

INSERT INTO EG_1145109 VALUES(1,'ALPHA',1000);
INSERT INTO EG_1145109 VALUES(2,'BETA',2000);
INSERT INTO EG_1145109 VALUES(101,'GAMA',3000);
INSERT INTO EG_1145109 VALUES(102,'THETA',4000);
\x
SELECT * FROM EG_1145109;

查询结果显示为如下:

 id  | name  | salary
-----+-------+--------
101  | GAMA  | 3000
102  | THETA | 4000
(2 rows)

8、删除策略。

select DBMS_RLS.drop_policy('EG_1145109',policy_name=>'EG_1145109_POLICY',object_schema=>'SCOTT_1145109');

drop_policy

语法格式

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,默认为空。

示例

参见DBMS_RLS.add_policy的示例

enable_policy

语法格式

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

    是否启用策略,类型为boolean。

  • object_schema

    对象模式。类型为text,默认为空。

示例

参见VPD功能的示例