AM_NAME CUST_ID ACCESS_TYPE ------- ------- ----------- SCOTT 123 S SCOTT 123 I SCOTT 123 D SCOTT 123 U SCOTT 456 S SCOTT 789 S LARA 456 I LARA 456 D LARA 456 U LARA 456 S
正如你所看到的,客戶123的AM SCOTT擁有所有權限--S、I、D和U--客戶456的AM LARA也具有這些權限。還有,由于SCOTT可以批準LARA的客戶456的賬戶結余,所以他擁有對客戶456的S權限。 第一步 創建政策函數 無論AM何時要查看客戶的賬戶信息,他都必須動態地應用銀行的訪問規則(包含在ACCESS_POLICY表中)。第一步是創建政策函數,用于返回要應用到表上的適當判定詞。和對ACCESS_POLICY表的處理一樣,出于安全考慮,政策函數也由用戶的SECMAN創建和控制。最好是使隱私規則與它們將要應用到的表分開。 讓我們仔細看一看政策函數get_sel_cust_id,如代碼清單2— in detail: 準確接收兩個參數:模式名稱(p_schema in varchar2)和表名(p_table in varchar2)。 只返回一個字符串值--return varchar2 as l_retstr varchar2(2000),它包含將要添加到表的每個查詢中的判定詞。 使用一個游標例程--for cust_ rec in--來獲得值的列表,因為每個用戶可能有表中列出的幾個cust_id。 返回一個結構化的字符串l_retstr,無論用戶何時試圖訪問基本表都將它用做一個判定詞。 該函數返回判定詞where cust_id in,隨后是用戶(am_name = USER)能夠看到的客戶賬戶名單(由逗號分隔)。 請注重在進入構建用戶cust_id名單的循環之前,代碼清單2中的代碼先檢查該用戶是否為表的所有者BANK,若是則返回NULL,如下所示:
insert into access_policy values ('SECMAN',123,'S'); insert into access_policy values ('SECMAN',456,'S'); insert into access_policy values ('SECMAN',789,'S');
下面來執行該函數:
select get_sel_cust_id ('BANK','CUSTOMERS') from dual;
該函數返回一個將被用作判定詞的字符串,如下面的示例輸出所示:
GET_SEL_CUST_ID('BANK','CUSTOMERS') ------------------------ CUST_ID IN (123,456,789)