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: 准确接收两个参数:模式名称(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名单的循环之前,先检查该用户是否为表的所有者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)