使用Oracle VPD(Virtual Private Database)限制使用者擷取資料的範圍

來源:互聯網
上載者:User
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技術的具體應用案例。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.