日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 數據庫 > 數據庫應用 > [精]Oracle VPD詳解(虛擬專用數據庫)

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

來源:程序員人生   發布時間:2016-11-11 08:15:21 閱讀次數:6775次

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

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

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

1、基于行的VPD  

基于行的VPD 也叫作Fine-Grained Access Control ,簡稱 FGAC 。FGAC 通過定義規則實現,規則 的集合叫做FGAC 政策(policy)。如果對某個表設置了 FGAC ,則當用戶對該表發出查詢或DML 語句時,Oracle 都會根據定義的 FGAC 政策,而自動改寫這些SQL 語句。其改寫方式為自動在SQL 語句后面添加where條件。 
比如,我們在OE用戶下有1個表sales_list ,寄存了所有的銷售記錄。每一個銷售人員只能查詢他 自己的銷售記錄。因而,我們在sales 表上設置FGAC 政策來實現這個業務需求。如果某個銷售人員 (假定其登錄的用戶名為 S0020 )發出下面的查詢語句: 
  1. Select * from sales_list ;
Oracle 在履行該語句時,如果發現 sales_list 表上存在FGAC 政策,因而就會根據 FGAC 政策,依照以下方式改寫該SQL 語句: 
  1. Select * from sales_list where seller_id='S0020';
對用戶來講,這個添加 where條件的進程是完全透明的,用戶其實不知道 Oracle 已改寫了他發出的SQL 語句,從而過濾了查詢結果。固然,如果該銷售人員發出的語句為: 
  1. Select * from sales_list where values>1000 ;
那末,當Oracle 在改寫該 SQL 語句時,則會改寫為以下情勢: 
  1. Select * from sales_list where qty_sold>1000 and seller_id='S0020';
使用FGAC 政策來限定返回記錄的方式具有許多優點。比如,不需要改寫利用程序、對用戶完全透明、集中設置、便于管理等。 
在使用FGAC 時,會觸及利用程序上下文(Application Context)的概念,使用利用程序上下文可 以簡化FGAC 的實現。利用程序上下文是1個數據庫對象,可以把它理解為數據庫里的每一個 session 的全局環境變量。1旦用戶登錄到數據庫,從而創建出session 以后,利用程序上下文就在全部 session 的生命周期里可用。在利用程序上下文里可以定義多個屬性,并為這些屬性設置具體的值。而用戶不 能直接修改屬性的值,只能通進程序包來修改屬性值。利用程序上下文總是由用戶sys 具有。 
比如,對前面 sales_list 表的例子來講。我們可以創建1個利用程序上下文,當用戶登錄時,將 該用戶的ID 號作為1個屬性值放入該利用程序上下文中。然后在定義FGAC 政策的時候,將該用戶 ID號取出,并作為限定條件短語(也就是where條件語句)返回給 Oracle,從而實現FGAC 。 
Oracle 數據庫里,已為每一個 session 都預先建立了1個利用程序上下文:userenv。1旦建立了session ,該 session 就能夠使用這個利用程序上下文。在 userenv中已預先定義了1些屬性,比如 ip_address、session_user和db_name 等。在獲得利用程序上下文里的屬性值時,我們使用sys_context 函數。該函數包括兩個參數,第1個參數表示利用程序上下文的名稱,第2個參數表示要顯示的屬性 名稱。以下所示: 
  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
我們也能夠創建自己的利用程序上下文,以下所示: 
  1. SQL> create or replace context sales_ctx using oe.sales_app_pkg;
在這里,sales_ctx 是利用程序上下文的名稱,而 sales_app_pkg 則是用來設置sales_ctx 里屬性的程序包。在創建利用程序上下文時,指定的、用來設置其中屬性的程序包可以沒必要事前存在。但是在為利用程序上下文里設定屬性值時,該程序包必須存在,否則報錯。如果要刪除利用程序上下文,則使用下面的命令: 
  1. SQL> drop context sales _ctx;
創建了利用程序上下文以后,我們就能夠在其中設置屬性了。在設置具體的利用程序上下文屬性時,必須使用Oracle 提供的程序包 dbms_session.set_context 來設置其屬性。其使用格式為: 
  1. dbms_session.set_context ('context_name', 'attribute_name', 'attribute_value')
我們只能在程序包里使用dbms_session.set_context,而不能直接在SQL*Plus里調用。以下所示: 
  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
我們創建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 程序包的權限賦給所有用戶以后,我們可以測試利用程序上下文是不是生效了。 
  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
可以看到,利用程序上下文生效了。接下來,我們創建用于FGAC 規則的函數。 
  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;
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产性色av | 国产欧美精品一区 | 精品久久久久久综合日本 | 天堂网亚洲 | 99久久精品一区二区成人 | 国产中文字幕一区 | 亚洲精品毛片 | www国产亚洲精品久久网站 | 国产精品美女久久久久av超清 | 欧洲免费vps一级毛片 | 欧美aa| 黄色精品视频 | 国产一区二区三区视频在线 | 亚洲优女在线 | 久www| 91色在线视频 | 九九热久久久99国产盗摄蜜臀 | 欧美日韩中文在线观看 | 欧美一级xxx | 国产永久免费 | 久久久久久午夜 | 国产一区二区三区在线免费观看 | www.欧美色图 | 国产精品视频播放 | 欧美日韩精品二区 | 国产精品美女久久久久久久网站 | 国产影院av | 久久久久久穴 | 国产一区二区三区精品久久久 | 国产精品高清一区二区三区 | 91香蕉视频在线观看免费 | 精品一区三区 | 亚洲一区二区国产 | 91久久一区二区 | 免费a v视频 | 亚洲影院一区 | 精品无码久久久久久久动漫 | 99久色| 免费爱爱视频 | 亚洲精品成人在线播放 | 久久精品亚洲精品 |