多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > 數(shù)據(jù)庫 > 數(shù)據(jù)庫應(yīng)用 > [精]Oracle VPD詳解(虛擬專用數(shù)據(jù)庫)

[精]Oracle VPD詳解(虛擬專用數(shù)據(jù)庫)

來源:程序員人生   發(fā)布時間:2016-11-11 08:15:21 閱讀次數(shù):6744次

所謂虛擬專用數(shù)據(jù)庫(VPD)指的是,通過在數(shù)據(jù)庫里進行配置,從而讓不同的用戶只能查看某 個表里的部份數(shù)據(jù)。VPD分為以下兩個級別。 

  • 行級別:在該級別下,可以控制某些用戶只能查看到某些數(shù)據(jù)行。比如,對銷售數(shù)據(jù)表sales 來講,每一個銷售人員只能檢索出他自己的銷售數(shù)據(jù),不能查詢其他銷售人員的銷售數(shù)據(jù)。 

  • 列級別:在該級別下,可以控制某些用戶不能檢索某個表的某個列的值。比如用戶HR 下的 employees 表中,含有工資(salary)列,由于該列比較敏感,因此不讓其他用戶查詢該列的值。 其他用戶檢索該列時,會發(fā)現(xiàn)其值全都為空(null )。 

1、基于行的VPD  

基于行的VPD 也叫作Fine-Grained Access Control ,簡稱 FGAC 。FGAC 通過定義規(guī)則實現(xiàn),規(guī)則 的集合叫做FGAC 政策(policy)。如果對某個表設(shè)置了 FGAC ,則當用戶對該表發(fā)出查詢或DML 語句時,Oracle 都會根據(jù)定義的 FGAC 政策,而自動改寫這些SQL 語句。其改寫方式為自動在SQL 語句后面添加where條件。 
比如,我們在OE用戶下有1個表sales_list ,寄存了所有的銷售記錄。每一個銷售人員只能查詢他 自己的銷售記錄。因而,我們在sales 表上設(shè)置FGAC 政策來實現(xiàn)這個業(yè)務(wù)需求。如果某個銷售人員 (假定其登錄的用戶名為 S0020 )發(fā)出下面的查詢語句: 
  1. Select * from sales_list ;
Oracle 在履行該語句時,如果發(fā)現(xiàn) sales_list 表上存在FGAC 政策,因而就會根據(jù) FGAC 政策,依照以下方式改寫該SQL 語句: 
  1. Select * from sales_list where seller_id='S0020';
對用戶來講,這個添加 where條件的進程是完全透明的,用戶其實不知道 Oracle 已改寫了他發(fā)出的SQL 語句,從而過濾了查詢結(jié)果。固然,如果該銷售人員發(fā)出的語句為: 
  1. Select * from sales_list where values>1000 ;
那末,當Oracle 在改寫該 SQL 語句時,則會改寫為以下情勢: 
  1. Select * from sales_list where qty_sold>1000 and seller_id='S0020';
使用FGAC 政策來限定返回記錄的方式具有許多優(yōu)點。比如,不需要改寫利用程序、對用戶完全透明、集中設(shè)置、便于管理等。 
在使用FGAC 時,會觸及利用程序上下文(Application Context)的概念,使用利用程序上下文可 以簡化FGAC 的實現(xiàn)。利用程序上下文是1個數(shù)據(jù)庫對象,可以把它理解為數(shù)據(jù)庫里的每一個 session 的全局環(huán)境變量。1旦用戶登錄到數(shù)據(jù)庫,從而創(chuàng)建出session 以后,利用程序上下文就在全部 session 的生命周期里可用。在利用程序上下文里可以定義多個屬性,并為這些屬性設(shè)置具體的值。而用戶不 能直接修改屬性的值,只能通進程序包來修改屬性值。利用程序上下文總是由用戶sys 具有。 
比如,對前面 sales_list 表的例子來講。我們可以創(chuàng)建1個利用程序上下文,當用戶登錄時,將 該用戶的ID 號作為1個屬性值放入該利用程序上下文中。然后在定義FGAC 政策的時候,將該用戶 ID號取出,并作為限定條件短語(也就是where條件語句)返回給 Oracle,從而實現(xiàn)FGAC 。 
Oracle 數(shù)據(jù)庫里,已為每一個 session 都預(yù)先建立了1個利用程序上下文:userenv。1旦建立了session ,該 session 就能夠使用這個利用程序上下文。在 userenv中已預(yù)先定義了1些屬性,比如 ip_address、session_user和db_name 等。在獲得利用程序上下文里的屬性值時,我們使用sys_context 函數(shù)。該函數(shù)包括兩個參數(shù),第1個參數(shù)表示利用程序上下文的名稱,第2個參數(shù)表示要顯示的屬性 名稱。以下所示: 
  1. SQL> select sys_context('userenv','ip_address') "IP",
  2. sys_context('userenv','db_name') "DB" from dual;
  3. IP DB
  4. --------------- ---------
  5. 152.68.32.60 ora10g
我們也能夠創(chuàng)建自己的利用程序上下文,以下所示: 
  1. SQL> create or replace context sales_ctx using oe.sales_app_pkg;
在這里,sales_ctx 是利用程序上下文的名稱,而 sales_app_pkg 則是用來設(shè)置sales_ctx 里屬性的程序包。在創(chuàng)建利用程序上下文時,指定的、用來設(shè)置其中屬性的程序包可以沒必要事前存在。但是在為利用程序上下文里設(shè)定屬性值時,該程序包必須存在,否則報錯。如果要刪除利用程序上下文,則使用下面的命令: 
  1. SQL> drop context sales _ctx;
創(chuàng)建了利用程序上下文以后,我們就能夠在其中設(shè)置屬性了。在設(shè)置具體的利用程序上下文屬性時,必須使用Oracle 提供的程序包 dbms_session.set_context 來設(shè)置其屬性。其使用格式為: 
  1. dbms_session.set_context ('context_name', 'attribute_name', 'attribute_value')
我們只能在程序包里使用dbms_session.set_context,而不能直接在SQL*Plus里調(diào)用。以下所示: 
  1. SQL> show user
  2. USER is "SYS"
  3. SQL> exec dbms_session.set_context('sales_ctx','seller_id','S0020');
  4. BEGIN dbms_session.set_context('sales_ctx','seller_id','S0020'); END;
  5. *
  6. ERROR at line 1:
  7. ORA-01031: insufficient privileges
  8. ORA-06512: at "SYS.DBMS_SESSION", line 90
  9. ORA-06512: at line 1
我們創(chuàng)建oe.sales_app_pkg包,以下所示: 
  1. SQL> connect oe/oe
  2. SQL> create or replace package sales_app_pkg is
  3. 2 procedure set_sales_context;
  4. 3 end;
  5. 4 /
  6. SQL> create or replace package body sales_app_pkg is
  7. 2 procedure set_sales_context is
  8. 3 begin
  9. 4 dbms_session.set_context('sales_ctx','seller_id',user);
  10. 5 end;
  11. 6 end;
  12. 7 /
  13. SQL> grant select on sales_list to public;
  14. SQL> grant update on sales_list to public;
  15. SQL> grant execute on sales_app_pkg to public;
把履行oe.sales_app_pkg 程序包的權(quán)限賦給所有用戶以后,我們可以測試利用程序上下文是不是生效了。 
  1. SQL> connect hr/hr
  2. SQL> exec oe.sales_app_pkg.set_sales_context;
  3. SQL> select sys_context('sales_ctx','seller_id') from dual;
  4. SYS_CONTEXT('SALES_CTX','SELLER_ID')
  5. --------------------------------------------------------------------------------
  6. HR
可以看到,利用程序上下文生效了。接下來,我們創(chuàng)建用于FGAC 規(guī)則的函數(shù)。 
  1. SQL> create or replace package sales_app_pkg is
  2. 2 procedure set_sales_context;
  3. 3 function where_condition
  4. 4 (p_schema_name varchar2,p_tab_name varchar2)
  5. 5 return varchar2;
  6. 6 end;
  7. 7 /
  8. SQL> create or replace package body sales_app_pkg is
  9. 2 procedure set_sales_context is
  10. 3 v_user varchar2(30);
  11. 4 begin
  12. 5 dbms_session.set_context('sales_ctx','seller_id',user);
  13. 6 end;
  14. 7
  15. 8 function where_condition
  16. 9 (p_schema_name varchar2,p_tab_name varchar2) return varchar2 is
  17. 10 v_seller_id varchar2(100) := upper(sys_context('sales_ctx','seller_id'));
  18. 11 v_where_condition varchar2(2000);
  19. 12 begin
  20. 13 if v_seller_id like 'S%' then
  21. 14 v_where_condition := 'seller_id = ' || '''' || v_seller_id || '''';
  22. 15 else
  23. 16 v_where_condition := null;
  24. 17 end if;
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 久草香蕉| 中文字幕一区二区三区有限公司 | 亚洲小说另类 | 久久亚洲国产视频 | 亚洲成aⅴ人在线观看 | 日韩欧美综合 | 福利久久 | 中文国产成人精品久久一 | 自拍自录videosfree自拍自录 | 老司机午夜精品网站在线观看 | 日韩欧美一中文字幕不卡 | 五月激情婷婷综合 | 日本v视频 | 国产欧美日韩一区二区三区视频 | 欧美日韩在线亚洲国产人 | 日韩欧美中文字幕出 | 国产永久免费高清在线观看视频 | 性久久久久久久久 | 波多野结衣手机在线视频 | 国产色播| 男女免费观看在线爽爽爽视频 | 欧美人与牲禽ⅹxxx伦交 | 欧美一级爱爱视频 | 伊久久| 一级看片免费视频 | 国产或人精品日本亚洲77美色 | 亚洲欧美久久精品1区2区 | 欧美激情性xxxxx | 午夜视频在线播放 | 欧美三级大片在线观看 | h网站免费在线观看 | 国产香蕉一区二区精品视频 | 91亚洲在线 | 娇小性色xxxxx中文 | 精品99一区二区三区麻豆 | 亚洲在线视频网站 | 大杳蕉伊人狼人久久一本线 | 中文字幕不卡高清免费 | 韩国三级午夜理伦三级99 | 欧美日韩一 | 国产福利一区在线 |