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 
        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 的子节点,EstuaryAirport 的子节点,AirportPort 的子节点,由此表明 Bay 在此等级的三个节点中具有较低的数据敏感度。实际上,它不像任何被标记为 Port 数据,而是归类到较低的级别。Port 值可用作标签分配给允许存取所有关于此 Port 数据的用户。

如果此示例中的 ALTER SECURITY LABEL COMPONENT 语句成功,且随后定义的数据行标签指定 Bay 作为 Oakland 构件的值,对安全策略不具有豁免权的用户在尝试在一个查询中读取受保护的表时,它需要 PortAirportEstuaryBay其中之一作为安全, 没有此安全策略的豁免的用户尝试读取查询中受保护的行时则需要将 PortAirportEstuaryBay 作为用户标签值以满足此数据行标签的组件。因为它们不符合 Bay 且不是 Bay 的祖,所以此用户标签中的该构件的 UptownDowntown 值不满足。对于读取受保护的行的查询,该用户的安全标签包含满足此行安全标签的任何其它构件的值,且该用户也持有对此表的 Select 存取权限,以及至少对包含该保护的行的数据库的 Connect 存取权限。

ADD TREE 子句无法在现有子节点和其父节点之间插入一个新的节点。