一、VPD概念
虚拟专用数据库 (VPD) 提供了角色和视图无法提供的行级访问控制。在企业中,为了确保客户只能访问到自己的数据,而不能访问其他客户的数据,比如银行行业,客户只能看到自己的账户里的数据,但是不能访问到其他客户的数据,提高数据的安全性,也能降低成本,因此使用VPD技术
二、工作原理
将一个或多个安全策略与表或视图关联后,就可以实现虚拟专用数据库。
三、简单示例
达梦数据库管理系统提供了 DBMS_RLS 包, DBMS_RLS 包通过策略(POLICY)管理方法来实现数据行的隔离。
以下创建一个员工表,员工自己只能看到自己的信息,只有管理员才能看到所有员工信息
第一步:执行过程
SP_CREATE_SYSTEM_PACKAGES(1);
第二步:创建测试用户user1,user2
create user user1 identified by 123457890;
create user user2 identified by 1234567890;
grant dba to user1;
grant dba to user2;
第三步:创建员工表:
drop table if exists sysdba.employee;
create table sysdba.employee (eid int,ename varchar(10),salary double,mouth int);
insert into sysdba.employee values(1,'user1',5000,1);
insert into sysdba.employee values(2,'user2',5000,1);
insert into sysdba.employee values(3,'user1',5000,2);
insert into sysdba.employee values(4,'user2',5000,2);
insert into sysdba.employee values(5,'user1',5100,3);
commit;
此时,user1依旧可以看到五条数据
第四步:创建策略函数
CREATE OR REPLACE FUNCTION FN_employee(p_schema VARCHAR2,p_object VARCHAR2)
RETURN VARCHAR2 IS
v_user VARCHAR2(100) := CURRENT_USER();
v_where_condition VARCHAR2(2000);
BEGIN
IF v_user = 'SYSDBA' THEN
v_where_condition := NULL;
ELSE
v_where_condition := 'ename = ''' || v_user || '''';
END IF;
RETURN v_where_condition;
END;
CURRENT_USER():当前用户
第五步:创建策略组
DBMS_RLS.CREATE_POLICY_GROUP(
OBJECT_SCHEMA=>'SYSDBA', --模式名
OBJECT_NAME=>'EMPLOYEE', --表名
POLICY_GROUP=>'PG_EMPLOYEE' --策略组名
);
第六步:将创建好的策略应用到我们设定的员工表
DBMS_RLS.ADD_GROUPED_POLICY(
OBJECT_SCHEMA=>'SYSDBA', --表模式名
OBJECT_NAME=>'EMPLOYEE', --表名
POLICY_GROUP=>'PG_EMPLOYEE', --策略组名
POLICY_NAME=>'EMPLOYEE_POLICY', --策略名
FUNCTION_SCHEMA=>'SYSDBA', --策略函数的模式名
POLICY_FUNCTION=>'FN_employee', --策略函数名
STATEMENT_TYPES=>'select,update,delete,insert', --应用策略的DML语句类型
UPDATE_CHECK=>true,
ENABLE=>true --是否启用策略
);
以上步骤已经完成策略创建和使用了
接下来测试是否成功,user1登录
select * from sysdba.employee;
以上就是简单总结DM的VPD的使用。