DBMS_RLS 实现一个数据库表为行级安全控制,该套餐包括细粒度的访问控制管理界面,此接口是用来实现VPD(Virtual Private Database),虚拟专用数据库。DBMS_RLS仅仅能在ORACLE的企业版(Enterpris Edition Only)本才干够用。oracle ebs 的权限是用这个来管理的。

在数据库的数据安全訪问的解决上,有非常多的方法来解决权限的问题。有的是通过功能模块来控制訪问权限的,有的是用建立视图的方法控制,比如查询语句中加where语句来控制。可是用view的方法时,当表结构或者权限变更的时候就非常不easy操作,编码工作量大、系统适应用户管理体系的弹性空间较小,一旦权限逻辑发生变动,就可能须要改动权限体系,导致全部的View都必须改动;用where语句能够解决这个问题可是安全性不好,仅仅能在应用程序级别才干控制。绕开应用程序就无法控制。

Oracle VPD 技术在数据库级别的安全控制有效的攻克了数据訪问操作的权限问题,能够对数据库对象进行訪问控制,能够灵活的隔离数据,oracle已经实现了VPD,能够直接使用。比在应用层权限控制实现起来较方便,权限维护也比easy。

VPD訪问控制原理也是使用where语句来控制,仅仅是这个where语句是数据库在操作数据时自己主动拼接,不是在应用层拼接,并且由事先定义的策略来决定是否拼接条件语句。

以下我来用DBMS_RLS的包来实现例如以下条件的訪问控制功能:

有例如以下4个用户AM145,AM147,AM148,AM149

1,仅仅能查询OE.CUSTS表,

2,其过滤条件是OE.CUSTS.account_mgr_id=substr(user,3,3)

第一步:创建用户及訪问授权

$>sqlplus / as sysdba

create user AM145 identified by AM145;

grant create session to AM145;

grant select on oe.custs to AM145;

create user AM147 identified by AM147;

grant create session to AM147;

grant select on oe.custs to AM147;

create user AM148 identified by AM148;

grant create session to AM148;

grant select on oe.custs to AM148;

create user AM149 identified by AM149;

grant create session to AM149;

grant select on oe.custs to AM149;

第二步:创建function获得where 过滤条件的predicate.函数返回拼接在DML语句的where条件之后的语句,可是where语句并非运行DML时可见的,系统根绝策略自己主动加入的,条件来自策略函数的返回值。



vi fun1.sql

create or replace FUNCTION oe.policy_function (object_schema IN VARCHAR2, object_name VARCHAR2)

        RETURN VARCHAR2 IS

ls_return varchar2(100);

ls_username varchar2(100);

begin

        ls_username := user;

        if ls_username like 'AM%' then

                ls_return := 'oe.custs.account_mgr_id=substr('||''''||ls_username||''''||',3,3)';

        end if;

        return ls_return;

end;

/

SQL> @fun1.sql

Function created.

第三步:加入策略

vi myPolicy1.sql

BEGIN

dbms_rls.add_policy(object_schema => 'oe',

object_name => 'custs',

policy_name => 'my_policy1',

function_schema =>'oe',

policy_function => 'policy_function',

statement_types =>'select',

enable=>true);

END;

/

SQL> @myPolicy1.sql

PL/SQL procedure successfully completed.

第四步:验证是否成功

SQL> select account_mgr_id,count(*) from oe.custs group by account_mgr_id;

ACCOUNT_MGR_ID   COUNT(*)

-------------- ----------

           147         76

           149         74

           148         58

           145        111

SQL> conn AM145/AM145

Connected.

SQL> select count(*) from oe.custs;

COUNT(*)

----------

       111

SQL> conn AM147/AM147

Connected.

SQL>  select count(*) from oe.custs;

COUNT(*)

----------

        76

SQL> conn AM148/AM148

Connected.

SQL>  select count(*) from oe.custs;

COUNT(*)

----------

        58

SQL> conn AM149/AM149

Connected.

SQL>  select count(*) from oe.custs;

COUNT(*)

----------

        74

从上面能够看出,对用户AM145,AM147,AM148,AM149的訪问控制成功。

Note:删除策略:

SQL> CONN / AS SYSDBA

Connected.

SQL> exec DBMS_RLS.DROP_POLICY('oe', 'CUSTS', 'my_policy1');

PL/SQL procedure successfully completed.

SQL> conn AM145/AM145

Connected.

SQL> select count(*) from oe.custs;

COUNT(*)

----------

       319

删除策略后用户AM145,AM147,AM148,AM149是能够看OE表的全部的行数据的。

版权声明:本文博主原创文章,博客,未经同意不得转载。

DBMS_RLS包实现数据库表中的行级安全控制的更多相关文章

  1. Django学习路5_更新和删除数据库表中元素

    查找所有的元素 Student.objects.all() 查找单个元素 Student.objects.get(主键=值) 主键 pk = xxx 更新数据库数据后进行保存 stu.save() 删 ...

  2. 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁

    转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...

  3. [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

    注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...

  4. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  5. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

  6. [SAP ABAP开发技术总结]将文件存储到数据库表中,并可发送邮件

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. 针对Oracle数据库表中的数据的常见操作

    1.查询表中所有数据 select * from 表名; 例:select * from stu; 2.查询的同时修改表中数据 select * from 表名  for update; 例:sele ...

  8. MySQL中的行级锁,表级锁,页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

  9. 【转】MySQL中的行级锁,表级锁,页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

随机推荐

  1. Swift中的dispatch_once 单例模式

    以下有三种方法实现单例模式,支持懒初始化和线程安全 全局变量 结构 dispatch_once 全局变量: 这里使用了全局变量而非类变量,是因为不支持类变量 private let _Singleto ...

  2. fish code

    <embed width="272" height="180" type="application/x-shockwave-flash" ...

  3. sass编译css(转自阮一峰)

    一.什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一 ...

  4. 【转载】详细解读C#中的 .NET 弱事件模式

    你可能知道,事件处理是内存泄漏的一个常见来源,它由不再使用的对象存留产生,你也许认为它们应该已经被回收了,但不是,并有充分的理由. 在这个短文中(期望如此),我会在 .Net 框架的上下文事件处理中展 ...

  5. 入门1:PHP的优点

    一.语法简单 二.学习成本低 (因为语法简单 所以学习成本低) 三.开发效率高 (PHP运行流程很简单,语法也很简单,必然开发效率就高) 四.跨平台 (我们只需要写一份PHP的程序,就可以非常方便的把 ...

  6. python自动开发之第二十一天

    一.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? 1.Form表单提交: 提交 -> url > 函数或类中的方法 - .... HttpResp ...

  7. Rewrite的QSA是什么意思?

    原版的英文: When the replacement URI contains a query string, the default behavior of RewriteRule is to d ...

  8. DbUtils组件

    DbUtils组件 DbUtils组件, 1. 简化jdbc操作 2. 下载组件,引入jar文件 : commons-dbutils-1.6.jar |-- DbUtils 关闭资源.加载驱动 |-- ...

  9. [待续]Async in C# 1

    异步.异步是在.net .45里面提供的一个新的方法 它主要用在.三个方面 1.网络访问 2.磁盘访问 3.延迟很长时间的步骤 它主要有2个关键字 Async  Await Async  怎么工作 d ...

  10. java design

    http://www.austintek.com/mvc/ http://msdn.microsoft.com/zh-cn/magazine/cc163419.aspx http://www.croc ...