发明的详尽描述
用户属性
图1的框图示出了依照本发明的示例性系统。计算机5运行数据库软件8,其保存有数据表,图示为表11、13和15。许多应用程序,图示为程序ABC、DEF和GHI,也在计算机5上运行。其中一些是用于检索和使用表11、13和15中的数据。每一个该系统的用户,X、Y和Z,可以通过终端访问计算机5,图示分别为计算机18、21和24。依照本发明,用户X、Y和Z分配到一个或多个“属性”。每一个属性有一个名称,标明访问被定义的应用程序功能部件(例如,访问数据库中的数据的权力),并且有一个定义访问权限的值,在后面将更详细的解释。如果不特别指出,如这里所用到的,术语属性将用来指名称-值对。
属性通过数据库软件8被保存在表中,并分别定义用户运行应用程序ABC、DEF和GHI的权力。例如,两个有用的属性为DATA_SCOPE和USER_LEVEL。DATA_SCOPE定义用户被允许访问的数据,并用前面表1作为范例,其拥有的可能的值为A、B、C或ALL,它们分别表示与客户A、B、C或所有三个客户有关的数据。USER_LEVEL是一较宽的属性,其通常定义用户选择运行一给定应用程序特定功能部件的访问级别。USER_LEVEL具有的值最好为ADMIN、REGULAR和RESTRICTED,其中ADMIN限制性最少,准许访问所有可用的应用程序功能部件,例如,检索报告,电子邮件,打印。RESTRICTED限制用户至基础应用程序功能部件,例如,产生报告。REGULAR级用户允许访问的功能部件比ADMIN级用户少,但比RESTRICTED级用户多。每个应用程序都可以基于它所提供的不同功能部件来解释USER_LEVEL属性。这就可以理解一些精确集中的属性,例如,与报告生成或打印有关,可以代替USER_LEVEL属性了。
两个属性DATA_SCOPE和USER_LEVEL,以及它们各自的值,当然都只是例子。本领域技术人员可以理解定义限制访问应用程序功能部件的属性是不受限制的。
分组
属性可以分配给单独的用户,或者如最佳实施例中,执行分组的方案,其范例在图2中显示。属性如DATA_SCOPE和USER_LEVEL以方块表示,“属性组”以三角形表示,而“受托人组”以圆形表示。属性组只包含属性及它们的值,而受托人组包括属性组和/或其它的受托人组,并不是单个的属性。在首选的分组方案实例中,每个属性组被限定为对应一个应用程序的属性,从而提供可为不同的应用程序分配不同的属性和值的能力。在一个可供选择的实例中,属性组可以独立于特殊的应用程序而生成,这样一个组就可以包含所有应用程序的属性。尽管定义对单独应用程序功能部件的访问缺少了一些适应性,但这样的系统是比较容易实现的。
在这首选的实施例中,表APPS,它至少包含一列为APP_CODE,定义有相关属性的合法应用程序的列表。回到前面参考图1,合法的APP_CODE值是ABC、DEF和GHI。在APPS表中的其它列将包含每个应用程序所必需的任何信息。例如,在一菜单系统中,它提供图标,用户可以从中选择应用程序运行,APP_NAME列将包含特殊字符串作为图标的可视标识它与APP_CODE列中的应用程序相关联。
每个属性组定义为由APP_CODE确定的特殊应用程序定义一组零或多个属性。零属性的属性组用来说明应该为应用程序分配属性的默认值。通常默认值是最具限制性的。另一种情况,零属性的属性组可以用来说明除了运行程序的能力,没有APP_CODE确定的访问被定义的应用程序功能部件。
图2的分组范例描绘了比前面讨论过与图1和表1有关的例子更复杂的用户结构。图2中属性组106、115、130、145和148属性分配如下:
表2
属性组 |
应用程序 |
属性名称 |
属性值 |
106 |
GHI |
DATA_SCOPE |
ALL |
USER_LEVEL |
ADMIN |
115 |
DEF |
DATA_SCOPE |
ALL |
USER_LEVEL |
REGULAR |
130 |
ABC |
DATA_SCOPE |
A |
DATA_SCOPE |
B |
USER_LEVEL |
REGULAR |
145 |
ABC |
DATA_SCOPE |
A |
DATA_SCOPE |
B |
USER_LEVEL |
RESTRICTED |
148 |
DBF |
DATA_SCOPE |
B |
DATA_SCOPE |
C |
USER_LEVEL |
RESTRICTED |
在这最佳实施例中,每个属性组对应的应用程序在该组建立的时候被指定,并在讨论的范例中由上面表2中第二列显示出来。
回到图2,分配了属性组106的用户将有属性DATA_SCOPE107和USER_LEVEL108,及其各自的值ALL和ADMIN,如表2所示。根据属性,在程序被运行时,用户将被允许对应用程序GHI进行ADMIN式访问,并且被准许访问与客户A、B和C有关的数据。分配了属性组130的用户将有三个属性DATA_SCOPE133、DATA_SCOPE136和USER_LEVEL139,以及各自的值A、B和REGULAR。根据属性,这个用户可以访问与客户A或B相关的数据,并可以访问应用程序ABC的功能部件,它是为REGULAR身份的用户预先定义的。分配了属性组145的用户可以对应用程序ABC进行RESTRICTED式访问,并被准许访问与客户A和B有关的数据。分配了属性组148的客户将被允许对应用程序DEF进行RESTRICTED式访问,并被准许访问与客户B和C有关的数据。
一个或多个属性组可以分配给受托人组。图2中,例如受托人组142可以由属性组145和148组成,并且可以包括下面表3中最后两列所列出的所有的属性名称-值对:
表3
受托人组 |
属性组 |
应用程序 |
属性名称 |
属性值 |
142 |
145 |
ABC |
DATA_SCOPE |
A |
DATA_SCOPE |
B |
USER_LEVEL |
RESTRICTED |
148 |
DEF |
DATA_SCOPE |
B |
DATA_SCOPE |
C |
USER_LEVEL |
RESTRICTED |
受托人组也可以分配给其它的受托人组。这可以从图2中受托人组103看出,它包括了受托人组142的所有属性以及属性组130和135的所有属性。在图上端,受托人组100由受托人组103和属性组106组成。因此,受托人组100包含了五个属性组130、145、148、115和106的所有属性。
属性分组系统特别适用于给责任级别不同的雇员分配属性。例如,属性组115、130、145和148可以分配给低或中级雇员,而受托人组100、103和142以及属性组106可以分配给管理人员,其职责是监督下级雇员的工作,至于属性组106,就是运行他们自己的应用程序。
在优化的分组系统中,对属性组、受托人组和用户进行的属性分配保存在表ATTRIBUTES中。ATTRIBUTES表有三列:ASSIGNEE、ATTRIBUTE_NAME和ATTRIBUTE_VALUE。ASSIGNEE可以是属性组名称,受托人组名称或是用户。ATTRIBUTE_NAME是属性名称(例如,DATA_SCOPE)。ATTRIBUTE_VALUE是命名属性的特定值(例如,ALL)。
ATTRIBUTES表由七个基本命令来维护。范例命令是以用于Oracle数据库环境中的Oracle程序写出的。本领域的技术人员可以导出适于其它环境的类似命令。在以下的描述中,单引号中是参数,双引号中是字符串。
命令1
attr_utils.create_group('group_name','group_type','app_code')
'group_name':组的名称
'group_type':"ATTRIBUTE"或"ASSIGNEE"
'app_code':如果'group_type'是"ATTRIBUTE",这一字段是需要的;否则,它将被忽略
这个例程将生成一指定类型的组。如果'group_name'已经作为一个组或Oracle用户存在,例程将由于错误而退出。
根据例程,'group_name'和'group_type'值转换成大写。然后,有下面一列值的记录被插入ATTRIBUTES表:
设置ASSIGNEE='group_name'
设置ATTRIBUTE_NAME="ASSIGNEE_TYPE"
设 置 ATTRIBUTE_VALUE = "ATTRIBUTE_GROUP"或"ASSIGNEE_GROUP"基于'group_type'的变量值。
另外,如果'group_type'是"ATTRIBUTE",下面有另一列值的记录将被插入ATTRIBUTES表:
设置ASSIGNEE='group_name'
设置ATTRIBUTE_NAME="APP_CODE"
设置ATTRIBUTE_VALUE='app_code'。
命令2
attr_utils.assign_group('assignee','group_name')
'assignee':有分配了'group_name'的用户或受托人组。
'group_name':分配给受托人的组。
这个例程将把一个组分配给另外一个组或用户。如果'assignee'作为受托人组或用户不存在,将返回错误信息。如果'group_name'不存在,同样返回错误信息。
这个例程首先将'assignee'和'group_name'的值转换化大写。其次,有下面一列值的记录被插入ATTRIBUTES表:
设置ASSIGNEE='assignee'
设置ATTRIBUTE_NAME="ASSIGNED_GROUP"
设置ATTRIBUTE_VALUE='group_name'。
命令3
attr_utils.assign_attribute('assignee','attribute_name','attribute_value)
'assignee':属性组名称。这必须是一个属性组。
'attribute_name':属性名称
'attribute_value':指定属性的值
这个例程将分配值的属性给'assignee'。当受托人组作为一个属性组不存在,或是attribute_name是保留字段,将返回错误信息。
这个例程首选将'assignee'和'attribute_name'值转化成大写,然后再将有下面一列值的记录插入ATTRIBUTES表:
设置ASSIGNEE='assignee'
设置ATTRIBUTE_NAME='attribute_name'
设置ATTRIBUTE_VALUE='attribute_value'。
命令4
attr_utils.drop_group('group_name')
'group_name':将与其相关信息一起被删除的组或用户的名称。
这个例程将删除组或用户及其相关信息。如果'group_name'不存在,将返回错误信息。
这个例程首先将'group_name'转化成大写,然后删除ATTRIBUTES表中ASSIGNEE列的值与'group_name'相符的所有记录。另外在ATTRIBUTES表中满足下面两个条件的所有记录也将被删除:
a.ATTRIBUTE_NAME列的值是"ASSIGNED_GROUP"。
b.ATTRIBUTE_NAME列的值与'group_name'相符。
命令5
attr_utils.rescind_group('assignee','group_name')
'assignee':用户或受托人组,其含有被删除的group_name
'group_name':从受托人组中删除的组
这个例程将从'assignee'中删除指定的'group_name'。如果'group_name'或'assignee'不存在,将返回错误信息。
这个例程首选将'assignee'和'group_name'转化成大写,然后将ATTIBUTES表中与下面三个条件符合的所有记录删除:
a.ATTIBUTE_NAME列中的值是"ASSINGED_GROUP"。
b.ATTIBUTE_VALUE列中的值与'group_name'相符。
c.ASSIGNEE列中的值与'assignee'相符。
命令6
attr_utils.rescind_attribute('assignee','attribute_name')
'assignee':属性组名称。这必须是一个属性组。
'attribute_name':属性名称。
这个例程将从'assignee'中删除指定的'attribute_name'。如果attribute_name和assignee不存在,或是attribute_name为保留字段,将返回错误信息。
这个程序首先将'assignee'和'attribute_name'转化成大写,然后将ATTRIBUTES表中满足以下两个条件的所有记录删除:
a.ASSIGNEE列中的值与'assignee'相符。
b.ATTRIBUTE_NAME列中的值与'attribute_name'相符。
命令7
attr_utils.update_attribute('assignee','attribute_name','attribute_value')
'assignee':属性组名称。这必须是一个属性组。
'attribute_name':属性名称。
'attribute_value':指定属性的新值。
这个例程将为确定的'assignee'和'attribute_name'更新指定的'attribute_value'。如果attribute_name或assignee不存在,或是attribute_name为保留字段,将返回错误信息。
这个例程首先将'assignee'和'attribute_name'转化成大写,然后更新ATTRIBUTES表,对于满足以下两个条件的所有记录,将把ATTRIBUTE_VALUE设置成'attribute_value':
a.ASSIGNEE列中的值与'assignee'相符。
b.ATTRIBUTE_NAME列中的值与'attribute_name'相符。
利用前面的命令,就维护了一个ATTRIBUTES表。如命令1和2中所示,在首选实施例中,一些保留的ATTRIBUTE_NAME在ATTRIBUTES表中使用,用来确定系统中所用到的特殊信息。"APP_CODE"的ATTRIBUTE_NAME自动分配给属性组,用以确定与组相关的应用程序。"ASSIGNED_GROUP"的ATTRIBUTE_NAME是用来给属性组分配属性,给受托人组分配属性组和受托人组,还给用户分配属性组和受托人组。"ASSIGNEE_TYPE"的ATTRIBUTE_NAME用来确定一个组是属性组还是受托人组。这些例程检查ATTRIBUTE_NAME参数以确定它们不是保留字段,如果使用了保留的ATTRUBUTE_NAME将返回错误信息。
举例说明,在下面的表4中将显示图2中受托人组142的ATTRIBUTES表的一部分:
表4
受托人 |
ATTRIBUTE_NAME |
ATTRIBUTE_VALUE |
ASSIGNEE_GOUP_142 |
ASSIGNEE_TYPE |
ASSIGNEE_GROUP |
ATTRIBUTE_GROUP_145 |
ASSIGNEE_TYPE |
ATTRIBUTE_GROUP |
ATTRIBUTE_GROUP_145 |
APP_CODE |
ABC |
ATTRIBUTE_GROUP_148 |
ASSIGNEE_TYPE |
ATTRIBUTE_GROUP |
ATTRIBUTE_GROUP_148 |
APP_CODE |
ABC |
ATTRIBUTE_GROUP_145 |
DATA_SCOPE |
A |
ATTRIBUTE_GROUP_145 |
DATA_SCOPE |
B |
ATTRIBUTE_GROUP_145 |
USER_LEVEL |
RESTRICTED |
ATTRIBUTE_GROUP_148 |
DATA_SCOPE |
B |
ATTRIBUTE_GROUP_148 |
DATA_SCOPE |
C |
ATTRIBUTE_GROUP_148 |
USER_LEVEL |
RESTRICTED |
ASSIGNEE_GOUP_142 |
ASSIGNED_GROUP |
ATTRIBUTE_GROUP_142 |
ASSIGNEE_GOUP_142 |
ASSIGNED_GROUP |
ATTRIBUTE_GROUP_145 |
在本发明供选择的实施例中,前面所讨论过的,属性组不是限制于特定的应用程序,creat_group例程不一定要求有'app_code'输入,而APP_CODE属性将不保存在ATTRIBUTES表中。但是,利用附加表将APP_CODE直接分配给用户,对应用程序大规模的访问仍可以控制。如果用户没有分配到特定的APP_CODE,用户将完全不能获得相应的应用程序。
父子结构
为单一的受托人组分配多重属性组和/或受托人组导致可以对同一组或用户分配交迭、重复甚至冲突的值。例如,受托人组100,图2上端所示,包括图中的每个属性,因此,如前面表2所示,对于同一应用程序DEF,DATA_SCOPE属性包括不同的值B、C和ALL,而USER_LEVEL有不同的值REGULAR和RESTRICTED。由于这个原因,在首选的实施例中,建立属性分层结构,其中每个属性值都分配了“父值”。例如,DATA_SCOPE属性的值B分配了父值ALL。在实际中,这被称作用户分配的属性,同一属性和应用程序的父值和子值都存在,父值将被保存而子值被删除。此外,重复的值将被删除。
父子的分配被保存在ATTRIBUTE_LEVELS表中,其中包括三列:ATTRIBUTE_NAME、CHILD_VALUE和PARENT_VALUE。ATTRIBUTE_NAME是属性的名称(例如,DATA_SCOPE)。CHILD_VALUE是属性的实际值(例如,C)。对于PARENT_VALUE来说,实际值是它的子集(例如,ALL)。有种情况,即实际值是结构中级别最高的,例如ALL,所分配的父值就是NULL(空)。
ATTRIBUTE_LEVELS表由四个基本命令维护。范例命令是以用于Oracle数据库环境中的Oracle程序写出的。本领域的技术人员可以导出适于其它数据库环境的类似命令。注意在以下的描述中,单引号中是参数,双引号中是字符串。
命令1
attr_utils.add_attr_level('attribute_name','child_value','parent_value')
'attribute_name':属性名称
'child_value':对应指定'attribute_name'的子值
parent_value':对应指定'attribute_name',指定'child_value'的父值
这个例程将给一指定的指针加上新的属性级别。如果'child_value'在指定的'attribute_name'的权限内具有最高级别,则'parent_value'为"NULL"。如果父值为空或不存在,将返回错误信息。
这个例程首先将'attribute_name'转化成大写,然后将有下面一列值的记录插入ATTRIBUTE_LEVELS表:
设置ATTRIBUTE_NAME='attribute_name'
设置CHILD_VALUE='child_value'
设置PARENT_VALUE='parent_value'
命令2
attr_utils.update_attr_level('attribute_name','child_value','parent_value')
'attribute_name':属性名称
'child_value':对应指定'attribute_name'的子值
parent_value':对应指定'attribute_name',指定'child_value'的父值
这个例程将为指定的参数更新父值。如果'child_value'在指定的'attribute_name'的权限内具有最高级别,则'parent_value'为"NULL"。如果父值为空或不存在,或者attribute_name与child_value组合不存在,将返回错误信息。
这个例程首先将'attribute_name'转化成大写,然后更新ATTRIBUTE_LEVELS表,对于满足下面两个条件的所有记录,将PARENT_VALUE列的值设置为'parent_value':
a.ATTRIBUTE_NAME列的值与'attribute_name'相符。
b.CHILD_VALUE列的值与'child_name'相符。
命令3
attr_utils.delete_attr_levels('attribute_name','child_value')
'attribute_name':属性名称
'child_value':对应指定'attribute_name'的子值
这个例程将删除属性级别以及指定指针所有的子属性级别。如果组合不存在,将返回错误信息。
这个例程首先将'attribute_name'转化成大写,然后将ATTRIBUTE_LEVELS表中指定组合对'attribute_name'和'child_value'所派生出的所有记录都删除。举例说明,以下SQL语句可以用来完成头两步:
DELETE ATTRIBUTE LEVELS
WHERE(ATTRIBUTE_NAME,CHILD_VALUE)IN
(SELECT ATTRIBUTE_NAME,CHILD_VALUE
FROM ATTRIBUTE_LEVELS
START WITH PARENT_VALUE=P_CHILD_VALUE
AND ATTRIBUTE_NAME=UPPER(P_ATTRIBUTE_NAME)
CONNECI BY PARENT_VALUE=PRIOR CHILE_VALUE
AND ATTRIBUTE_NAME=PRIOR ATTRIBUTE_NAME).
这个例程将删除ATTRIBUTE_LEVELS表中满足以下两个条件的所有记录:
a.ATTRIBUTE_NAME列的值与'attribute_name'相符。
b.CHILD_VALUE列的值与'child_name'相符。
命令4
attr_utils.delete_all_levels('attribute_name')
'attibute_name':属性名称
这个例程将删除指定attribute_name的所有属性级别。如果attribute_name不存在,将返回错误信息。
这个例程首先将'attribute_name'转化成大写,然后将ATTRIBUTE_LEVELS表中ATTRIBUTE_NAME列值与'attribute_name'相符的所有记录删除。
利用前面的命令,ATTRIBUTE_LEVELS表被保存。举例说明,下面的表5显示了一个ATTRIBUTE_LEVELS表,是对应前面讨论过的范例属性:
表5
ATTRIBUTE_NAME |
CHILD_VALUE |
RARENT_VALUE |
DATA_SCOPE |
A |
ALL |
DATA_SCOPE |
B |
ALL |
DATA_SCOPE |
C |
ALL |
DATA_SCOPE |
ALL |
NULL |
USER_LEVEL |
RESTRICTED |
REGULAR |
USER_LEVEL |
REGULAR |
ADMIN |
USER_LEVEL |
ADMIN |
NULL |
根据表5,如果对于同一应用程序,拥有值ALL的DATA_SCOPE赋值给同一用户,对于拥有值A、B或C的DATA_SCOPE属性的赋值将被删除。同样,较低级USER_LEVEL值的赋值将被删除以利于最高级别值的赋值。
更进一步,如果属性值在ATTRIBUTES表中赋值了,而没有在ATTRIBUTE_LEVELS表中定义,则被认为在ATTRIBUTE_LEVELS表中它被定义为带有NULL父值,并且没有具有值的其它值作为它的父值。
考虑到较低级完整的一组赋值变量可以由较高级变量取代,进一步的简化就可以实现了。例如,DATA_SCOPE值A、B和C被指定了,系统可以返回值ALL。这种简化只能在所有的较低级值与较高级值表示同一事物时才可使用,因为较高级值可能比较低级值代表的要多一些。
用户属性系统的操作
结合以下对本发明的用户属性系统示范使用的讨论,将对图3作出参考说明。根据发明的首选实施例,对数据库环境中运行程序的访问由初始的图形用户界面(IGUI)控制。IGUI的例子包括互联网站点主页和局域网的初始页面。
但是,在获准访问应用程序之前,用户通常要登录到计算机系统中,方框201所示,如果登录完全正确的话,计算机系统将确认用户。方框204,IGUI检索用户可用的应用程序。在首选实施例中,IGUI通过读取ATTRIBUTES表做到这点的,箭头205包含了给用户的分组分配。如前面所讨论的,在首选实施例中,组分配包括属性组分配,而它又包含了可用程序的指定。在Oracle数据库系统中准备了“视图(view)”,它优于搜索整个ATTRIBUTES表,而表又可能相当庞大,它保存有频繁使用的搜索结果(例如,特殊用户的属性),而且很有可能被反复使用。在可选择的实例中,属性不是限制于特定的应用程序,特殊用户可用的应用程序可以在分离的表中存储和检索。
在箭头205,IGUI也将访问合法程序的APPS表,其包含的APP_CODE列告知IGUI在方框207中显示给用户哪些字符串,此方框中IGUI显示给用户可用的应用程序。方框210中,用户选择其中一个可用的应用程序。方框213中,IGUI读取ATTRIBUTES表,在箭头214,检索对应所选程序的用户属性。在Oracle数据库系统中,视图可以再一次用于检索属性。另外,IGUI可以访问ATTRIBUTE_LEVELS表来删除属性个数。
在箭头215,IGUI将相关的属性传给应用程序,而在方框216中,应用程序,按程序执行属性运行。如果用户试图超越指定的限制,可能会显示错误或警告信息。
在可选择的实例中,本领域的技术人员可以理解可以直接检索属性,不需要IGUI的辅助,并执行属性。
视图
如前面所讨论的,Oracle视图在本发明中用于检索和组织来自表的记录。以下是十二个视图的列表,它们在本发明的执行中有用。这里提供了每个视图的解释和一个SQL范例。
视图1
V_ATTRIBUTE_APP_CODES
这个视图将返回,用户属性系统中安装的所有不同的应用程序代码的列表。这个视图对记录执行一条含有DISTINCT子句的SELECT,记录中的ATTRIBUTE_NAME是'APP_CODE'保留的ATTRIBUTE_NAME。
SQL范例:
CREATE OR REPLACE VIEW V_ATTRIBUTE_APP_CODES AS
SELECT DISTINCT ASSIGNEE,
ATTRIBUTE_VALUE_APP_CODE
FROM ATTRIBUTES
WHERE ATTRIBUTE_NAME='APP_CODE'
视图2
V_ATTRIBUTE_GROUPS_ATTR
这个视图将返回所有不同的属性组列表。这个视图对记录执行一条含有DISTINCT子句的SELECT,记录中的ATTRIBUTE_NAME是'ASSIGNEE_TYPE'保留的ATTRIBUTE_NAME,而ATTRIBUTE_VALUE是'ATTRIBUTE_GROUP'。
SQL范例:
CREATE OR REPLACE VIEW V_ATTRIBUTE_GROUPS_ATTR
AS SELECT DISTICT ASSIGNEE GROUP_NAME
FROM ATTRIBUTES
WHERE ATTRIBUTE_NAME='ASSIGNEE_TYPE'
AND ATTRIBUTE_VALUE='ATTRIBUTE_GROUP';
视图3
V_ATTRIBUTE_GROUPS_ASSIGN
这个视图将返回所有不同的受托人组列表。这个视图对记录执行一条含有DISTINCT子句的SELECT,记录中的ATTRIBUTE_NAME是'ASSIGNBE_TYPE'保留的ATTRIBUTE_NAME,而ATTRIBUTE_VALUE是'ATTRIBUTE_GROUP'。
SQL范例:
CREATE OR REPLACE VIEW
V_ATTRIBUTE_GROUPS_ASSIGN AS
SELECT DISTINCT ASSIGNEE GROUP_NAME
FROM ATTRIBUTES
WHERE ATTRIBUTB_NAME='ASSIGNEB_TYPE'
AND ATTRIBUTE_VALUE='ASSIGNEE_GROUP';
视图4
V_ATTRIBUTE_USERS
这个视图将返回所有不同的属性用户列表。这个视图对记录执行一条含有DISTINCT子句的SELECT,记录中的ASSIGNEE等于在Oracle数据程序库表ALL_USERS中找到的USER_NAME。
SQL范例:
CREATE OR REPLACE VIEW V_ATTRIBUTE_USERS AS
SELECT DISTINCT ASSIGNBE USERID
FROM ATTRIBUTES,
ALL_USERS
WHERE ASSIGNBE=USBRNAME;
视图5
V_ATTRIBUTB_GROUPS_ALL
这个视图将返回系统中所有不同的组列表。这包括属性组和受托人组。这个视图对记录执行一条含有DISTINCT子句的SELECT,记录中的ASSIGNEE不是属性用户。
SQL范例:
CREATE OR REPLACE VIEW V_ATTRIBUTE_GROUPS_ALL AS
SELECT DISTINCT ASSIGNBE GROUP_NAME
FROM ATTRIBUTES,
V_ATTRIBUTE_USERS
WHERE ASSIGNBE=USBRID(+)
AND USERID IS NULL;
视图6
V_USER_GROUPS
这个视图将返回分配给当前连接到Oracle用户的所有组的列表。这个结果包括直接分配给用户的组和间接分配给用户的组。进一步说,就是组分配给ASSIGNEE GROUPS,而ASSIGNEE GOUPS又分配给了用户。这个视图执行使用CONNECT BY子句的系统树型查询。
SQL范例:
CREATE OR REPLACE VIEW V_USER_GROUPS AS
SELECT ATTRIBUTE_NAME,
ATTRIBUTE_VALUE
FROM ATTRIBUTES
WHERE ATTRIBUTE_NAME!='ASSIGNEE_TYPE'
START WITH ASSIGNEE=USER
CONNECT BY ASSIGNEE=PRIOR ATTRIBUTE_VALUE
AND ATTRIBUTE_NAME='ASSIGNED_GROUP';
视图7
V_USER_ATTR_APPS
这个视图返回一列表,列表中是分配给当前连接到Oracle用户的所有属性,及相应的APP_CODE。这个视图将把分配给用户的组(V_USER_GROUP)列表,ATTRIBUTES表,和带有相应APP_CODE变量(V_ATTRIBUTE_APP_CODES)的ATTRIBUTE_GROUPS列表结合起来。
SQL范例:
CREATE OR REPLACE VIEW V_USER_ATTR_APPS AS
SELECT ATTR.ATTRIBUTE_NAME,
ATTR.ATTRIBUTE_VALUE,
APPS.APP_CODE
FROM V_USER_GROUPS GROUPS,
ATTRIBUTES ATTR,
V_ATTRIBUTE_APP_CODES APPS
WHERE GROUPS.ATTRIBUTE_VALUE=ATTR.ASSIGNEE
AND ATTR.ASSIGNEE=APPS.ASSIGNEE
AND ATTR.ATTRIBUTE_NAME NOT IN
('ASSIGNED_GROUP','APP_CODE','ASSIGNEE_TYPE');
视图8
V_USER_ATTR_HIGHEST_VALUES
这个视图将返回对于相应的ATTRIBUTE_NAME来说级别最高的ATTRIBUTE_VALUE列表。这个视图可以包含重复的条目,这样在后面的讨论中,V_USER_ATTRIBUTES视图可以检索这些不同值的列表。这个视图将会为每个分配给当前用户的属性,把APP_CODE、ATTRIBUTE_NAME 和 ATTRIBUTE_VALUE 传递到ATTR_UTILS.HIGHEST_VALUE函数中。函数与程序相同,只是它可以作为查询的一部分执行,并返回一个值。
这里,函数返回当前分配给用户的最高级父值。在此视图SQL范例之后是函数描述。
SQL范例:
CREATE OR REPLACE VIEW
V_USER_ATTR_HIGHEST_VALUES AS
SELECT APP_CODE,
ATTRIBUTE_NAME,
SUBSTR(ATTR_UTILS.HIGHEST_VALUE(APP_CODE,
ARRTIBUTE_NAME,ATTRIBUTE_VALUE),1,30)
ATTRIBUTE_VALUE
FROM V_USER_ATTR_APPS;
ATTR_UTILS.HIGHEST_VALUE函数要求三个输入:APP_CODE,ATTRIBUTE_NAME和ATTRIBUTE_VALUE。函数要先载入内部属性值表,此表由为给定用户分配的所有属性值组成,APP_CODE和ATTRIBUTE_NAME。函数可以利用一现成的视图(即V_USER_ATTR_VALUE_LEVELS)完成这一工作。然后函数将使用当前的属性值,并找到这一值的所有父记录。函数将使用如下的SQL查询:
SELECT PARENT_VALUE
FROM ATTRIBUTE_LEVELS
WHERE ATTRIBUTE_NAME=P_ATTRIBUTE_NAME
START WITH CHILD_VALUE=P_ATTRIBUTE_VALUE
CONNECT BY CHILD_VALUE=PRIOR PARENT_VALUE
ORDER BY LEVEL;
然后这个函数将每个父值与属性值表中的记录进行比较,以确定其它分配了属性的值中是否有父值,即当前属性值的父级,祖父级,及其它。如此后,最高级的属性值被返回。否则当前属性值被返回。
视图9
V_ATTR_VALUE_LEVELS
这个视图将返回一列表,包括ATTIBUTE_NAME、相关的ATTRIBUTE_VALUE和变量相应的级别。例如,最高级ATTIBUTE_VALUE将拥有值为1的ATTRIBUTE_LEVEL,而值的子级将拥有值2。这个视图执行使用CONNECT BY子句的系统树型查询。
SQL范例:
CREATE OR REPLACE VIEW V_ATTR_VALUE_LEVELS AS
SELECT ATTRIBUTE_NAME,
CHILD_VALUE ATTRIBUTE_VALUE,
LEVEL VALUE_LEVEL
FROM ATTRIBUTE_LEVELS
START WITH PARENT_VALUE IS NULL
CONNECT BY PARENT_VALUE=PRIOR CHILD_VALUE
AND ATTRIBUTE_NAME=PRIOR ATTRIBUTE_NAME;
视图10
V_USER_ATTR_VALUE_LEVELS
这个视图将返回所有分配给用户的属性及其相应级别的列表。这个视图将把分配给当前连接Oraele的用户属性的列表(V_USER_ATTR_APPS)和属性与其相应级别的列表(V_ATTR_VALUE_LEVELS)结合起来。
SQL范例:
CREATE OR REPLACE VIEW
V_USER_ATTR_VALUE_LEVELS
AS SELECT APP_CODE,
ATTR.ATTRIBUTE_NAME,
ATTR.ATTRIBUTE_VALUE,
NVL(VALUE_LEVEL,1)VALUE_LEVEL
FROM V_USER_ATTR_APPS ATTR,
V_ATTR_VALUE_LEVELS LVL
WHERE
ATTR.ATTRIBUTE_NAME=LVL.ATTRIBUTE_NAME(+)
AND
ATTR.ATTRIBUTE_VALUE=LVL.ATTRIBUTE_VALUE(+);
视图1l
V_USER_APP_CODES
这个视图将返回所有各别的分配给当前用户的APP_CODE列表。这个视图执行使用CONNECT BY子句的系统树型查询。
SQL范例:
CREATE OR REPLACE VIEW V_USER_APP_CODES AS
SELECT DISTINCT ATTR.ATTRIBUTE_VALUE APP_CODE
FROM(SELECT ATTRIBUTE_NAME,
ATTRIBUTE_VALUE
FROM ATTRIBUTES
START WITH ASSIGNEE=USER
CONNECT BY ASSIGNEE=PRIOR ATTRIBUTE_VALUE
AND ATTRIBUTE_NAME='ASSIGNED_GROUP')GROUPS,
ATTRIBUTES ATTR
WHERE GROUPS.ATTRIBUTE_VALUE=ATTR.ASSIGNEE
AND ATTR.ATTRIBUTE_NAME='APP_CODE';
视图12
V_USER_ATTRIBUTES
这个视图返回一列表,表中为所有分配给用户的属性,和只是相应ATTRIBUTE_NAME的最高级ATTRIBUTE_VALUE。这个视图在V_USER_ATTR_HIGHEST_VALUES(V_USER_ATTR_VALUE_LEVELS)上执行SELECT DISTINCT。
SQL范例:
CREATE OR REPLACE VIEW V_USER_ATTRIBUTES AS
SELECT DISTINCT
APP_CODE,
ATTRIBUTE_NAME,
ATTRIBUTE_VALUE
FROM V_USER_ATTR_HIGHEST_VALUES;
在Oracle环境中,为了确定将ATTRIBUTES表和ATTRIBUTE_LEVELS表中的数据正确存储,最好是只用Oracle程序执行所有对用户属性的存储。这是可以保证的,通过在用户属性系统内限制访问不同目标,如表、视图、程序和函数。只读权限应该给ATTRIBUTES表和ATTRIBUTE_LEVELS表,以及所有的视图。用于存储这些表的Oracle程序,其执行权限应该只给用户属性管理者。这样可以确定未被授权的用户不能操纵属性或属性级别。
本发明已经,参考了一些有说明性的范例和实例描述,但这些不能理解为是限制本发明的范围或是思想。在不背离所附权利要求中表述的发明范围的前提下,可以在实际应用中,由本领域的技术人员进行许多修改。