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 as

begin

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;

执行结果:

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

7782 CLARK MANAGER 7839 1981/6/9 2450.00 10

7934 MILLER CLERK 7782 1982/1/23 1300.00 10

只显示部门为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;

执行结果:

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

7369 SMITH CLERK 7902 1980/12/17 20

7499 ALLEN SALESMAN 7698 1981/2/20 300.00 30

7521 WARD SALESMAN 7698 1981/2/22 500.00 30

7566 JONES MANAGER 7839 1981/4/2 20

7654 MARTIN SALESMAN 7698 1981/9/28 1400.00 30

7698 BLAKE MANAGER 7839 1981/5/1 30

7782 CLARK MANAGER 7839 1981/6/9 2450 10

7788 SCOTT ANALYST 7566 1987/4/19 20

7844 TURNER SALESMAN 7698 1981/9/8 0.00 30

7876 ADAMS CLERK 7788 1987/5/23 20

7900 JAMES CLERK 7698 1981/12/3 30

7902 FORD ANALYST 7566 1981/12/3 20

7934 MILLER CLERK 7782 1982/1/23 1300 10

所有记录全部显示,只是配置了敏感字段的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;

这样就可以实现数据的查询权限控制了。

Oracle对于敏感数据的处理,可以采用策略(dbms_rls.add_policy)的更多相关文章

  1. SYS_R12 MOAC多组织底层技术实现技术分析(Oracle VPD) (案例)

    2014-05-30 Created By BaoXinjian

  2. Oracle策略相关

    Oracle策略可以限制查询.修改.删除.新增等操作,刚接触,对查询做一个测试: 参照 http://blog.csdn.net/diyyong/article/details/19552637 用法 ...

  3. Oracle VPD策略示例

    1.未创建前使用oe用户登录查询: SQL> select * from orders; ORDER_ID ORDER_DATE ORDER_MO CUSTOMER_ID ORDER_STATU ...

  4. Oracle设计规范!

    Oracle设计规范! 一哥们整理的Oracle的设计规范,相当的不错,贴这以备后续之需! 目录 1.数据库模型设计方法规范 1.1.数据建模原则性规范 1.2.实体型之间关系认定规范 1.3.范式化 ...

  5. Hibernate的实体规则、主键生成策略、对象状态

    一. hibernate的实体类有一定的规则,类似于mybatis的逆向工程导出的实体类.具体的规则以及原因如下: 1.持久化类需要提供无参的构造方法. 因为hibernate底层采用反射机制创建对象 ...

  6. Oracle 备份与恢复 15 个典型问题

    1.问:Oracle11g数据库数据量有50T,每天增量50g左右,该如何制定备份方案,如何验证备份的有效性? 答:50T的数据也不大,运营商的地市级市数据基本都在100T以上了,只要备份环境允许的话 ...

  7. Oracle数据库备份、灾备的23个常见问题

    为了最大限度保障数据的安全性,同时能在不可预计灾难的情况下保证数据的快速恢复,需要根据数据的类型和重要程度制定相应的备份和恢复方案.在这个过程中,DBA的职责就是要保证数据库(其它数据由其它岗位负责) ...

  8. 【转】京东金融App端链路服务端全链路压测策略

    京东金融移动端全链路压测历时三个月,测试和服务端同学经过无数日日夜夜,通宵达旦,终于完成了移动端链路的测试任务.整个测试有部分涉及到公司敏感数据,本文只对策略部分进行论述. 1.系统架构与策略 在聊性 ...

  9. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)

    集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习 ...

随机推荐

  1. weak_ptr<T>智能指针

    weak_ptr是为配合shared_ptr而引入的一种智能指针,它更像是shared_ptr的一个助手,而不是智能指针,因为它不具有普通指针的行为,没有重载operator*和operator-&g ...

  2. 找不到指定的 VM 安装:类型 标准 VM,名称 jre7

    问题背景是这样 原来使用的是jre7.0.55,后来为了安装使用 layabox IDE ,然后装了jdk_8u144 之后需要切换环境变量 之后java项目调试的时候重新设置了jdk,没问题. 直到 ...

  3. MySQL利用xtrabackup在线修复或新增从库

    如果数据库的数据量很大,表大小有几十个G,利用mysqldump导出备份会消耗非常长的时间,会对数据库产生不稳定风险,这时可以利用xtrabackup工具在线复制主库文件,利用复制出来的主库文件可以修 ...

  4. 生成网上下载的EF项目对应的数据库

    生成网上下载的EF项目对应的数据库 网上下载的用EF做的小项目,结果没有配有数据库的,用VS打开来看了一下,看到Migrations文件夹,应该可以用EF命令来生成这个数据库了 打开appsettin ...

  5. 解决AndroidStudio导入项目卡在gradle加载界面

    为了节省排版时间,直接上图了,图片若看不清,可在新标签中打开查看. 文中图片上涉及到的一些链接如下: maven { url 'http://maven.aliyun.com/nexus/conten ...

  6. Delphi目录监控、目录监听

    资料地址: 1.https://www.cnblogs.com/studypanp/p/4890970.html 单元代码: (************************************ ...

  7. python输出有色记录

    一.第三方模块coloredlogs # Create a logger object. import logging logger = logging.getLogger('your-module' ...

  8. 机器学习&深度学习基础(机器学习基础的算法概述及代码)

    参考:机器学习&深度学习算法及代码实现 Python3机器学习 传统机器学习算法 决策树.K邻近算法.支持向量机.朴素贝叶斯.神经网络.Logistic回归算法,聚类等. 一.机器学习算法及代 ...

  9. 解决MAMP启动mysql服务 但是Navicat连接不上

    问题重现 错误信息 2003 - Can't connect to MySQL server on '127.0.0.1' (61 "Connection refused") 解决 ...

  10. Github + Hexo 搭建个人博客

    参考博客: 我是如何利用Github Pages搭建起我的博客,细数一路的坑 使用Hexo+Github一步步搭建属于自己的博客(基础) Hexo 准备工作: 本机已安装好 git, npm 和 no ...