实例3:使用Dual Key安全功能
现实场景中,我们希望DBA遵守制度,比如在修改表结构之前,通知OGG相关人。或者为了增加安全性,要求DBA做的重大操作,必须得到老板的批准。DV可以利用Dual Key功能满足这种需求。
简单说,我们可以写一个存储过程,判断流程中需要通知的人是否在线,如果在线,才允许执行相应的操作。而那个需要被通知的人,只要拥有connect数据库的权限就行,他(她)的登录动作就变成了一种授权或被通知后的确认。
具体步骤:
首先给DV的管理员授权,让用户可以访问字典视图和编写存储过程:
SQL> GRANT CREATE PROCEDURE TO dv_manager;
Grant succeeded.
SQL> GRANT SELECT ON V_$SESSION TO dv_manager;
Grant succeeded.
我们假设授权的用户是“BOSS“,而执行操作的用户是”TEST“,相应的判断BOSS是否在线的存储过程如下:
CREATE OR REPLACE FUNCTION check_boss_logged_in
return varchar2
authid definer as
v_session_number number := 0;
v_allow varchar2(10) := 'TRUE';
v_deny varchar2(10) := 'FALSE';
BEGIN
SELECT COUNT(*) INTO v_session_number
FROM SYS.V_$SESSION
WHERE USERNAME = 'BOSS';
IF v_session_number > 0
THEN RETURN v_allow;
ELSE
RETURN v_deny;
END IF;
END check_boss_logged_in;
/
使用DV管理员创建这个Function,然后授权给DVSYS:
SQL>GRANT EXECUTE ON check_boss_logged_in to DVSYS;
创建Rule Set:
Name:Dual Key
Evaluation Options:Any True
规则如下:
创建Command Rule:
这个Command Rule达到的效果是,如果test用户想alter owner为test的table,必须boss用户同时在线,否则报错,无权限。如果是其他人修改test用户下的表,不受这个限制。
最后的效果:
BOSS用户没有在线,那么TEST用户alter table报错
只有在test用户通知了boss用户,或者按照流程,得到了boss用户的批准,boss用户用登录数据库这个动作来代表确认,test用户才可以修改表结构: