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功能的示例。