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