• 使用Oracle VPD(Virtual Private Database)限制用户获取数据的范围


    VPD全称Virtual Private Database,这个技术提供了对数据库信息的细粒度访问控制。关于VPD的更多描述性信息可通过Oracle官方文档获得:http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/apdvpoli.htm#i1009600
    通过一个具体案例,体验一下VPD带给我们的功能特点。

    1.初始化环境
    构造表T,其中包含一个字段X。
    sec@ora10g> create table t (x number);
    sec@ora10g> insert into t values (1);
    sec@ora10g> insert into t values (2);
    sec@ora10g> insert into t values (10001);
    sec@ora10g> insert into t values (10002);
    sec@ora10g> commit;
    sec@ora10g> select * from t;

             X
    ----------
             1
             2
         10001
         10002

    2.问题场景描述
    禁止查询T表中X列值大于10000的数据。

    3.实现方法一:使用视图
    这种方法可能是大家都很容易想到的,实现起来相对简单。但无法真正做到禁止访问基础表。
    sec@ora10g> create view v_t as select * from t where x <=10000;

    View created.

    sec@ora10g> select * from v_t;

             X
    ----------
             1
             2

    此时如果直接查询基础表t,仍然可以获得说有的数据。
    sec@ora10g> select * from t;

             X
    ----------
             1
             2
         10001
         10002

    4.实现方法二:使用VPD
    1)创建VPD需要的函数,这里给出的名字是f_limited_query_t。
    CREATE OR REPLACE FUNCTION f_limited_query_t (s_schema IN VARCHAR2,
                                                  s_object IN VARCHAR2)
       RETURN VARCHAR2
    AS
    BEGIN
       RETURN 'X <= 10000';
    END;
    /

    Function created.

    2)将函数与需要保护的表进行关联
    BEGIN
       DBMS_RLS.add_policy (object_schema   => 'SEC',
                            object_name     => 'T',
                            policy_name     => 'POLICY_LIMITED_QUERY_T',
                            function_schema => 'SEC',
                            policy_function => 'F_LIMITED_QUERY_T');
    END;
    /

    PL/SQL procedure successfully completed.

    3)验证VPD效果
    此时在sec用户下直接查询t表,获得的也仅仅是我们要求的数据范围
    sec@ora10g> select * from t;

             X
    ----------
             1
             2

    即便是连接到其他用户依然无法获得sec用户下t表隐藏掉的数据。
    sec@ora10g> conn secooler/secooler
    Connected.
    secooler@ora10g> select * from sec.t;

             X
    ----------
             1
             2

    只有sys用户有权查看到sec用户下t表的全部数据
    sec@ora10g> conn / as sysdba
    Connected.
    sys@ora10g> select * from sec.t;

             X
    ----------
             1
             2
         10001
         10002

    4)去掉VPD对数据访问的限制
    我们可以使用DBMS_RLS.drop_policy来完成这个任务。
    secooler@ora10g> conn sec/sec
    Connected.

    BEGIN
       DBMS_RLS.drop_policy (object_schema   => 'SEC',
                             object_name     => 'T',
                             policy_name     => 'POLICY_LIMITED_QUERY_T');
    END;
    /

    PL/SQL procedure successfully completed.

    此时可获得T表的全部数据
    sec@ora10g> select * from t;

             X
    ----------
             1
             2
         10001
         10002

    5.小结
    这里给出的是VPD最简单的一种使用方法,在实际应用中需求可能会比较复杂,但通过分析并仔细定制,VPD都可以胜任。
    欢迎大家分享关于VPD技术的具体应用案例。

             

                成长

           /      |     \

        学习   总结   分享

    QQ交流群:122230156

  • 相关阅读:
    架构漫谈阅读笔记(1)
    第一周学习进度
    2月13号寒假总结
    2月12日寒假总结
    2月11日寒假总结
    2月10日寒假总结
    寒假学习进度笔记一
    mapreduce课上实验
    个人课程总结
    用户体验评价
  • 原文地址:https://www.cnblogs.com/benio/p/1967998.html
Copyright © 2020-2023  润新知