使用 ALTER SECURITY LABEL COMPONENT 语句向当前数据库中的一个现有的安全标签构件中 添加一个或多个元件。该语句是 SQL ANSI/ISO 标准的扩展。
语法
用法
只有 DBSECADM 可以声明 ALTER SECURITY LABEL COMPONENT 语句,此语句定义现有安 全标签构件的新元件。新的元件称为定义在引用指定构件的 CREATE SECURITY POLICY 语句中 的安全策略的一部分。
一个安全标签构件由不多于 64 个 elements 的集合组成,它们由 CREATE SECURITY LABEL COMPONENT 语句定义为字符串常量。每个字符串常量不多于 32 字节,而且必须在该构件的元件 中是唯一的。每个元件的声明(是构件具有的有效值)定义数据的敏感度的类别。通过向现有构件 中添加新的元件,ALTER SECURITY LABEL COMPONENT 语句扩展了构件在包含该成分的安全策 略内或在支持安全策略的安全标签内的可具有的值的设定。
当 ALTER SECURITY LABEL COMPONENT 语句运行成功后, GBase 8s 更新以下当前数据库中系统目 录的表:
· ⚫ sysseclabelcomponentelements 表,向该构件的新元件中添加新行,
· ⚫ sysseclabelcomponents 表,显示构成该修改的安全构件的安全元件的新基数。
此语句可以定义一个安全标签构件的新元件,但是不能修改或伤处现有的元件。如果安全设计变更, 以致于需要不同的元件,那么 DBSECADM 可以添加新的元件(如果元件的总数量保持在大小和基 数的限制内,且不使用包含在该构件中的定义的表中的任何过时的元件)。
或者, DBSECADM 可以使用 DROP SECURITY LABEL COMPONENT 元件删除此构件,然后使 用 CREATE SECURITY LABEL COMPONENT 元件重新定义新的构件,新的构件只包含必须的元 件。然而,如果此构件是现有安全策略的一部分,则您不能删除此安全构件。有关删除安全标签构 件和其它 GBase 8s 安全对象的限制,请参阅 DROP SECURITY 语句 。
要添加新元件的安全标签构件必须是三种构件类型之一。跟随在 component 名称之后的 ARRAY 、 SET 或 TREE 关键字指定的构件类型必须与最初定义构件时 CREATE SECURITY LABEL COMPONENT 语句指定的构件类型相同。指定元件的新列表依赖于该指定的构件是否为 ARRAY 、 SET 或 TREE 类型,这三种类型是 GBase 8s 支持的三种安全构件的类型。
ADD ARRAY 子句
ARRAY 类型的安全标签组件是超过 64 个元素的有序集合。声明数组元素的顺序很重要,因为它 定义了数据敏感性的降序,每个连续的元素在数据敏感性上都低于前面的元素。数组的标签元素集 及其逗号( , )分隔符必须放在一对括号( [...])内。相同的新元素不能在同一 ADD ARRAY 子句中声明多次。
在 ADD ARRAY 子句中,BEFORE 或 AFTER 关键字必须跟随在新元件(或以逗号分隔的新元件 的列表)之后按数据敏感度降序指定新元件的位置。在对元素大小和数量的限制中,此语法使 DBSECADM 能够在数组中任何位置(包括最高位置和最低位置)或在连续的现有元素之间插入新 元素。然而,如果 ADD ARRAY 子句的 BEFORE 或 AFTER 关键字指定了之前未定义的数组元 素(无论是在创建数组组件时,还是在先前的 ALTER SECURITY LABEL COMPONENT 语句中), ALTER SECURITY LABEL COMPONENT 语句都会失败并显示错误。
如果在同一个 ARRAY 类型的构件中执行了多个 ALTER SECURITY LABEL COMPONENT 操作 以添加新元件, 由于数组元件的编码方式,DBSECADM 可能无法到达 64 组元件的最大值。有关 安全元件是如何编码的信息,请参阅 GBase 8s 安全指南 。
以下示例定义了一个 ARRAY 类型的安全标签构件 aquilae ,它是五个元件的顺序集, imperator 在数据敏感度中是最高的,最低的是 asinus 。随后的 ALTER SECURITY LABEL COMPONENT 语句添 加了两个新元件:
· ⚫ 称为 legatus 的新元件排列在 imperator 和 tribunus 之间
· ⚫ 称为 cunctator 的新元件排列在 asinus 之后,作为数据敏感度的新的最低一级。 CREATE SECURITY LABEL COMPONENT aquilae
ARRAY [ "imperator", "tribunus", "centurio", "miles", "asinus" ];
ALTER SECURITY LABEL COMPONENT aquilae
ADD ARRAY [ "legatus" BEFORE "tribunus","cunctator" AFTER "asinus" ];
该 ALTER SECURITY LABEL COMPONENT ... ADD ARRAY 语句的成功运行修改了 aquilae 安 全标签构件组,因此构件元件新的降序顺序为:imperator 、legatus 、tribunus 、centurio 、 miles 、asinus 、cunctator。
GBase 8s SQL 指南:语法
ADD SET 子句
SET 类型的安全标签构件是不多于 64 个元件的无序集合。SET 构件中的元件的声明的顺序是没有 意义的。数组元件的集合以及它们的逗号分隔符必须用一对大括号({...})括起。在同一 ADD SET 子句中,同一新 element 只能声明一次。
以下示例定义了一个 SET 类型的安全标签组件 departments ,它是三个元件的无序集合,这三个 元件为 Marketing 、HR 和 Finance 。随后被 ALTER SECURITY LABEL COMPONENT 语句以添加三个 新元件 Training 、QA 和 Security 的方式修改:
CREATE SECURITY LABEL COMPONENT departments
SET { 'Marketing', 'HR', 'Finance' };
ALTER SECURITY LABEL COMPONENT departments ADD SET { 'Training', 'QA', 'Security' };
不像 ADD ARRAY 或 ADD TREE 规范,因为 SET 类型的构件的元件没有隐式的数据敏感度的顺 序,所以 ALTER SECURITY LABEL COMPONENT 的 ADD SET 操作在重定义的构件的新的和现 有元件中的不创建“多于”或“少于”数据敏感度关系。
ADD TREE 子句
TREE 类型的安全标签构件具有没有循环的简单图的逻辑拓扑。每个 TREE 构件都有单独的根节点 和不多于 63 个的附加节点。ALTER SECURITY LABEL COMPONENT 语句添加到此等级的新元件 必须在根节点之下插入。每个新节点的字符串常量必须跟随在 UNDER 关键字和之前声明的字符串 常量之后。TREE 构件的元件集合。包括它们的 UNDER 关键字和逗号分隔符必须用一对括号
( ( ... ))括起。
在 UNDER 关键字之后指定的标签元素称为同一 UNDER 关键字(称为该父元素的 child)之前的 标签元素的 parent。新元件称为父元件的 child 。然而,如果 ADD TREE 子句为该构件指定了在 数据库中未定义的父元件,则 ALTER SECURITY LABEL COMPONENT 产生错误并失败。UNDER 关键字不能跟随在一个已添加到同一 ADD TREE 子句中的构件元件之后。
指定为 TREE 组件的根节点的字符串常量具有 TREE 分层结构内所有节点的最高的数据敏感性。 在 TREE 中连续的父节点和子节点的任何子集中,每个非根元素具有比其父元素或其父元素的任何 祖先低的数据敏感性,但是具有比它的任何子元素或其子元素的后代高的数据敏感性。
当没有豁免的用户尝试访问由包括 TREE 组件的标签保护的数据时,如果此用户的安全标签不包含 符合数据行标签的同一组件的 TREE 组件中的一个元素,或者不包含符合这些元素其中之一的祖先 的元素,则读取操作失败。除非该标签的安全策略包含 OVERRIDE 子句,否则在相同情景下写入 操作也会失败。如果此数据行标签有多个 TREE 构件,则用户安全标签必须包含与该成分的 TREE 构件的元件值匹配(或祖)元件值。
在以下示例中,ALTER SECURITY LABEL COMPONENT 元件修改了一个 TREE 构件 Oakland ,修改方 式为添加两个新节点到用它 CREATE SECURITY LABEL COMPONENT 语句定义的六个节点的树结构中: CREATE SECURITY LABEL COMPONENT Oakland
GBase 8s SQL 指南:语法
TREE ( 'Port' ROOT, 'Downtown' UNDER 'Port', 'Airport' UNDER 'Port', 'Estuary' UNDER 'Airport', 'Avenues' UNDER 'Downtown', 'Hills' UNDER 'Avenues');
ALTER SECURITY LABEL COMPONENT Oakland ADD TREE ( 'Uptown' UNDER 'Port',
'Bay' UNDER 'Estuary');
这里新的 Uptown 节点是 Port 的子节点,Port 有最高的数据敏感度,因为它是根节点。新的 Bay 节点是 Estuary 的子节点,Estuary 是 Airport 的子节点,Airport 是 Port 的子节点,由此表 明 Bay 在此等级的三个节点中具有较低的数据敏感度。实际上,它不像任何被标记为 Port 数据, 而是归类到较低的级别。Port 值可用作标签分配给允许存取所有关于此 Port 数据的用户。
如果此示例中的 ALTER SECURITY LABEL COMPONENT 语句成功,且随后定义的数据行标签指 定 Bay 作为 Oakland 构件的值,对安全策略不具有豁免权的用户在尝试在一个查询中读取受保护 的表时,它需要 Port 、Airport 、Estuary 或 Bay 其中之一作为安全, 没有此安全策略的豁免的用 户尝试读取查询中受保护的行时则需要将 Port 、Airport 、Estuary 或 Bay 作为用户标签值以满 足此数据行标签的组件。因为它们不符合 Bay 且不是 Bay 的祖,所以此用户标签中的该构件的 Uptown 或 Downtown 值不满足。对于读取受保护的行的查询,该用户的安全标签包含满足此行安 全标签的任何其它构件的值,且该用户也持有对此表的 Select 存取权限,以及至少对包含该保护的 行的数据库的 Connect 存取权限。
ADD TREE 子句无法在现有子节点和其父节点之间插入一个新的节点。