-
- GRANT FRAGMENT 语句
使用 GRANT FRAGMENT 语句来对本地数据库中的表分片分配权限,如果该表是通过表达式分片的话。
语法
元素 | 描述 | 限制 | 语法 |
fragment | 分片的名称 | 必须存在;不可用引号定界 | 标识符 |
grantor | 可取消该权限的用户 | 同 user | 所有者名称 |
owner | 拥有 table 的用户 | 必须为 table 的所有者 | 所有者名称 |
role | 获得权限的角色 | 在 sysusers 中必须存在 | 所有者名称 |
table | 对其授予分片权限的分片表 | 必须存在且必须通过表达式分片 | 标识符 |
user | 要将权限授予其的那个用户 | 必须为有效的授权标识符 | 所有者名称 |
用法
此语句是对 SQL 的 ANSI/ISO 标准的扩展。
使用 GRANT FRAGMENT 语句来将对表的个别分段的任何插入、更新和删除访问权限授予用户(或角色)。GRANT FRAGMENT 语句仅对根据基于表达式的分布方案分片的表是有效的。要了解对此类分片策略的说明,请参阅 表达式分布方案。
分片级权限
跟在 FRAGMENT 关键字之后的一个关键字或多个关键字指定分片级权限,这些权限是表级权限的一个逻辑子集:
分片级权限
这些关键字对应于下列分片级权限:
关键字 对被授予者的作用
ALL 获得对分片的插入、删除和更新权限
INSERT 可将行插入到分片内
DELETE 可从分片删除行
UPDATE 可更新在分片中的和在任何列中的行。
分片级授权的定义
在符合 ANSI 的数据库中,所有者隐式地获得对一新创建的表的所有表级权限,但其他用户得不到这些权限。
对一分片表有表权限的用户隐式地拥有对该表的所有分片的权限。这些权限不记录在 sysfragauth 系统目录表中。
当在不符合 ANSI 的数据库中创建分片表时,表的所有者隐式地获得该表上所有表级权限,且在缺省情况下其他用户(即 PUBLIC)获得所有分片级权限。在 systabauth 系统目录表中显式地记录授予 PUBLIC 的权限。
然而,如果您使用 REVOKE 语句来撤销现有的表级权限,则可使用 GRANT FRAGMENT 语句来给用户、角色或 PUBLIC 恢复指定的对该分片的一些子集的表级权限。
不论数据库是否符合 ANSI,您都可使用 GRANT FRAGMENT 语句来对通过表达式分片的表的一个或多个分片授予显式 Insert、Update 和 Delete 权限。在 sysfragauth 系统目录表中显式地记录 GRANT FRAGMENT 语句授予的权限。
通过 GRANT FRAGMENT 语句对表分片授予的 Insert、Update 和 Delete 权限统称为分片级权限或分片级授权。
分片级授权在语句验证中的作用
分片级权限使得用户能够对表分片执行 INSERT、DELETE 和 UPDATE 数据操作语言(DML)语句,即使被授权者对整个表缺乏 Insert、Update 和 Delete 权限。缺乏表权限的用户可在授权的分片中插入、删除和更新行,这是用于数据库服务器验证 DMIL 语句的算法决定的。此算法由下列检查构成:
- 当用户执行 INSERT、DELETE 或 UPDATE 语句时,数据库服务器首先检查该用户对尝试的操作是否有必要的表权限。如果表权限存在,则继续处理该语句。
- 如果不存在表权限,则数据库服务器检查该表是否通过表达式分片。如果该表未通过表达式分片,则数据库服务器返回错误给用户。此错误表示用户没有权限执行该语句。
- 如果该表通过表达式分片,则数据库服务器检查该用户是否对尝试的操作持有必要的分片权限。如果该用户持有要求的分片权限,则数据库服务器继续处理该语句。如果不存在分片权限,则数据库返回错误给用户。此错误表示用户没有执行该语句的权限。
分片级权限的持续时间
分片级权限的持续时间与分片策略的持续时间关联在一起成为一个整体。
如果您通过 DROP TABLE 语句或通过 ALTER FRAGMENT 语句的 INIT、DROP 或 DETACH 子句删除分片策略,则还删除存在于受影响的分片的所有权限。类似地,如果您删除表的分片,则还删除存在于该分片的任何权限。
作为 ALTER FRAGMENT 语句的 DETACH 或 INIT 子句的产物而创建的表,当这些分片是分片表的一部分时,不保持以前的一个分片或多个分片拥有的权限。相反,这些表采用缺省的表权限。
如果一个定义分片权限的表更改,更改为采用轮转法策略或其他表达式策略的表,则还删除该分片权限,且该表采用缺省的表权限。