Oracle策略的使用(dbms_rls.add_policy)
来源:互联网 发布:盛世全集网络剧百度云 编辑:程序博客网 时间:2024/06/05 11:32
数据访问控制权限,是一个在实际项目中用得很平常的问题。比如公司部门,就工资来说,本人只能看到自己的工资信息,不能看到其他同事的信息,部门经理或更高级别的人可以看到他对应权限的信息,看到这里大多数人会选择在View加上Where子句来进行数据隔离。此方法编码工作量大、系统适应用户治理体系的弹性空间较小,一旦权限逻辑发生变动,就可能需要修改权限体系,导致所有的View都必须修改。除了这种实现,可以采用Oracle的policy功能来实现。具体实现方式如下:
Oracle Policy的简单说明:
Policy应用于数据行访问权限控制时,其作用简而言之,就是在查询数据表时,自动在查询结果上加上一个Where子句。假如该查询已有where子句,则在该Where子句后面加上"And ..."。
由Oracle Policy自动加入的Where子句的内容,通常由一个函数来实现。而进行数据行访问权限控制算法实现的结果,也是通过该函数返回。
Oracle Policy语法说明:
创建策略:
begin -- Call the procedure dbms_rls.add_policy(object_schema => :数据表(或视图)所在的Schema名称/用户, object_name => :数据表(或视图)的名称, policy_name => :policy的名称 function_schema => :返回Where子句的函数所在Schema名称/用户, policy_function => :返回Where子句的函数名称, statement_types => :要使用该Policy的DML类型,如'Select,Insert,Update,Delete', update_check => 仅适用于Statement_Type为'Insert,Update',值为'True'或'False', enable => 是否启用,值为'True'或'False', static_policy => 默认值为FALSE。如果它被设置为TRUE则所有用户启用该策略,sys或特权用户例外。 policy_type => :默认值是null,意味着static_policy的值决定,在这里指定任何策略将覆盖static_policy的值。 long_predicate => long_predicate, sec_relevant_cols => :敏感的字段名称, sec_relevant_cols_opt => :设置为dbms_rls.ALL_ROWS来显示所有的行,敏感的列的值为null);end;
删除策略:
begin dbms_rls.drop_policy( object_schema=>'要删除的Policy所在的Schema', object_name=>'要删除Policy的数据表(或视图)名称', policy_name=>'要删除的Policy名称' );end;
改变policy状态:
begin dbms_rls.enable_policy( object_schema=>'要改变的Policy所在的Schema', object_name=>'要改变Policy的数据表(或视图)名称', policy_name=>'要删除的Policy名称', enable=>'默认True,是否启用,True为启用策略,False为禁用策略' );end;
需要注意,在普通用户下是没有dbms_rls的权限,在使用之前需要对其受权
grant execute,debug on dbms_rls to scott;具体实现:
在创建策略时需要创建策略使用到的函数:
create or replace function FN(p_schema in varchar2 default NULL, p_object in varchar2 default NULL) return varchar2 asbegin return 'deptno=10';end;创建一个策略,只能看到部门为10的数据:
begin dbms_rls.add_policy( object_schema=>'scott', object_name=>'emp', policy_name=>'emp', function_schema=>'scott', policy_function=>'FN', statement_types=>'SELECT' );end;
执行结果:
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO7782CLARKMANAGER78391981/6/92450.00107934MILLERCLERK77821982/1/231300.0010只显示部门为10的数据。
如果该用户可以看到自己部门信息,也可以看到其他部门的部分信息,一些敏感字段则不能看到,比如工资。根据上个策略,只增加两个条件即可,如下:
begin dbms_rls.add_policy( object_schema=>'scott', object_name=>'emp', policy_name=>'emp', function_schema=>'scott', policy_function=>'FN', statement_types=>'SELECT', sec_relevant_cols=>'sal', sec_relevant_cols_opt=>dbms_rls.ALL_ROWS );end;执行结果:
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO7369SMITHCLERK79021980/12/17207499ALLENSALESMAN76981981/2/20300.00307521WARDSALESMAN76981981/2/22500.00307566JONESMANAGER78391981/4/2207654MARTINSALESMAN76981981/9/281400.00307698BLAKEMANAGER78391981/5/1307782CLARKMANAGER78391981/6/92450107788SCOTTANALYST75661987/4/19207844TURNERSALESMAN76981981/9/80.00307876ADAMSCLERK77881987/5/23207900JAMESCLERK76981981/12/3307902FORDANALYST75661981/12/3207934MILLERCLERK77821982/1/23130010所有记录全部显示,只是配置了敏感字段的sal,不是部门为10的数据则显示为空。
改变策略状态:
begin dbms_rls.enable_policy( object_schema=>'scott', object_name=>'emp', policy_name=>'emp', enable=>true );end;删除策略:
begin dbms_rls.drop_policy( object_schema=>'scott', object_name=>'emp', policy_name=>'emp' );end;这样就可以实现数据的查询权限控制了。
0 0
- Oracle策略的使用(dbms_rls.add_policy)
- oracle Policy的应用--DBMS_RLS.ADD_POLICY
- 042 - dbms_rls.add_policy
- dbms_rls
- dbms_rls
- dbms_rls
- EnterpriseDB’s Virtual Private Database vs oracle’s DBMS_RLS
- hibernate+oracle下使用sequence策略设置主键的方法
- DBMS_RLS.SHARED_STATIC以及DBMS_RLS.SHARED_CONTEXT_SENSTIVE
- 关于oracle的备份策略
- 关于oracle的备份策略
- 关于oracle的备份策略
- oracle的表分析策略
- ORACLE的表分析策略
- Oracle 锁定策略的总结:
- oracle的几个违反策略
- Oracle锁定策略的总结
- UpdatePanel的使用策略
- 哈希表实现原理
- C# 使用 MemoryStream 将数据写入内存
- 【牛客网】single-number系列题解
- http调试工具Charles Proxy用法详解
- 不带修改主席树模板
- Oracle策略的使用(dbms_rls.add_policy)
- 去除字符串中的首尾空格并将连续的空格变为一个
- HDU 1548 A strange lift(构造+最短路Dijkstra)
- jenkins可持续集成
- 新手程序员须知
- 统计学习方法---隐马尔可夫模型1
- 最小生成树
- 广义表
- MySQL慢查询优化