GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 702 分片级授权的定义 在符合 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 语句的算法决定的。此算法由下列检查构成: 1. 当用户执行 INSERT、DELETE 或 UPDATE 语句时,数据库服务器首先 检查该用户对尝试的操作是否有必要的表权限。如果表权限存在,则继续 处理该语句。 2. 如果不存在表权限,则数据库服务器检查该表是否通过表达式分片。如果 该表未通过表达式分片,则数据库服务器返回错误给用户。此错误表示用 户没有权限执行该语句。
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 703 3. 如果该表通过表达式分片,则数据库服务器检查该用户是否对尝试的操作 持有必要的分片权限。如果该用户持有要求的分片权限,则数据库服务器 继续处理该语句。如果不存在分片权限,则数据库返回错误给用户。此错 误表示用户没有执行该语句的权限。 分片级权限的持续时间 分片级权限的持续时间与分片策略的持续时间关联在一起成为一个整体。 如果您通过 DROP TABLE 语句或通过 ALTER FRAGMENT 语句的 INIT、 DROP 或 DETACH 子句删除分片策略,则还删除存在于受影响的分片的所有权 限。类似地,如果您删除表的分片,则还删除存在于该分片的任何权限。 作为 ALTER FRAGMENT 语句的 DETACH 或 INIT 子句的产物而创建的表, 当这些分片是分片表的一部分时,不保持以前的一个分片或多个分片拥有的权 限。相反,这些表采用缺省的表权限。 如果一个定义分片权限的表更改,更改为采用轮转法策略或其他表达式策略的 表,则还删除该分片权限,且该表采用缺省的表权限。 指定分片 您可以括在紧跟在 ON table 规范之后的括号内的名称(或名称列表)指定一个分 片或一逗号分隔的分片列表。您不可使用引号来定界分片名称。如果您未包括分 片,或如果指定的表的分片与您罗列的分片不相匹配,则数据库服务器发出错 误。 必须通过其名称引用每一 fragment。如果当您创建该分片时,未声明显式的标识 符,则它的名称缺省为它所在其中的 dbspace 的名称。 通过 onspaces 实用程序成功地重命名 dbspace 之后,仅新的名称是有效的。 GBase 8s 自动地更新系统目录中现有的分片策略来替换新的 dbspace 名称,但您 必须在 GRANT FRAGMENT 语句中指定新的名称来引用那个缺省名称为重命名 的 dbspace 的名称的分片。
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 704 TO 子句 跟在 TO 关键字之后的一个或多个用户或角色的列表标识被授权者。您可指定 PUBLIC 关键字来将指定的分片级权限授予所有用户。 您不可使用 GRANT FRAGMENT 来给自己授予分片级权限,既不可直接授予也 不可通过角色授予。 如果您用引号括起 user 或 role,则该名称区分大小写,且安全按输入形式存 储。在符合 ANSI 的数据库中,如果您不使用引号括起 user 或 role,则该名称 以大写字母存储。 下列语句将对 part1 中的 customer 表的分片的 Insert、Update 和 Delete 权限 授予用户 larry: GRANT FRAGMENT ALL ON customer (part1) TO larry; 下列语句将对 part1 和 part2 中 customer 表的分片的 Insert、Update 和 Delete 权限授予用户 millie: GRANT FRAGMENT ALL ON customer (part1, part2) TO millie; 要将对表的所有分片的权限授予相同的一个或多个用户,您可使用 GRANT 语 句,而不使用 GRANT FRAGMENT 语句。您还可使用 GRANT FRAGMENT 语 句达到此目的。 假设 customer 表通过表达式分片为三个分片,且这些分片驻留在名为 part1、 part2 和 part3 的 dbspace 中。您可使用下列语句之一来将对该表的所有分片 的 Insert 权限授予用户 helen: GRANT FRAGMENT INSERT ON customer (part1, part2, part3) TO helen; GRANT INSERT ON customer TO helen; 向用户或用户列表授予权限 您可将分片级权限授予单个用户或多个用户的列表。 下列语句将对 part3 中的 customer 表的分片的 Insert、Update 和 Delete 权 限授予用户 oswald: GRANT FRAGMENT ALL ON customer (part3) TO oswald;
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 705 下列语句将对 part3 中的 customer 表的分片的 Insert、Update 和 Delete 权限 授予用户 jerome 和 hilda: GRANT FRAGMENT ALL ON customer (part3) TO jerome, hilda; 授予权限或权限列表 当您在 GRANT FRAGMENT 语句中指定分片级权限时,您可指定一种权限、多 种权限的列表或所有权限。 下列语句将对 part1 中的 customer 表的 Update 权限授予用户 ed: GRANT FRAGMENT UPDATE ON customer (part1) TO ed; 下列语句将对 part1 中的 customer 表的 Update 和 Insert 权限授予用户 susan: GRANT FRAGMENT UPDATE, INSERT ON customer (part1) TO susan; 下列语句将对 part1 中的 customer 表的 Insert、Update 和 Delete 权限授予用 户 harry: GRANT FRAGMENT ALL ON customer (part1) TO harry; WITH GRANT OPTION 子句 如同在其他 GRANT 语句中一样,WITH GRANT OPTION 关键字指定被授权者 可将相同的分片级权限授予其他用户。如果 TO 子句指定 role 作为被授权者, 则 WITH GRANT OPTION 是无效的。要获取附加的信息,请参阅 WITH GRANT OPTION 关键字。 下列语句将对 part3 中的 customer 表的分片的 Update 权限授予用户 george,并赋予 george 将对同一分片的 Update 权限授予其他用户的权利: GRANT FRAGMENT UPDATE ON customer (part3) TO george WITH GRANT OPTION; AS grantor 子句 GRANT FRAGMENT 语句的 AS grantor 子句可指定权限的授权者。仅当您有对 数据库的 DBA 权限,您才可使用此子句。当您包括 AS grantor 子句时,数据库 服务器罗列指定为 grantor 的用户或角色作为 sysfragauth 系统目录表的 grantor 列中的权限的授权者。
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 706 在下一示例中,DBA 将对 part3 分片中的 customer 表的分片的 Delete 权限授 予用户 martha,并使用 AS grantor 子句来指定罗列在 sysfragauth 中的用户 jack 作为该权限的授权者: GRANT FRAGMENT DELETE ON customer (part3) TO martha AS jack; 在前一示例中 AS grantor 子句的作用之一是,用户 jack 可执行 REVOKE FRAGMENT 语句来取消 martha 持有的 Delete 分片级权限,如果此语句是在 part3 中对 customer 行 martha 的分片权限的唯一来源的话。 省略 AS grantor 子句 当 GRANT FRAGMENT 不包括 AS grantor 子句时,发出该语句的用户为指定 的分片权限的缺省的授权者。 在下一示例中,用户将对 part3 中的 customer 表的分片的 Update 权限授予用 户 fred。因为此语句未指定 AS grantor 子句,所以在缺省情况下,将发出该语 句的用户罗列在 sysfragauth 系统目录表中作为该权限的授权者。 GRANT FRAGMENT UPDATE ON customer (part3) TO fred; 如果您省略 GRANT FRAGMENT 的 AS grantor 子句,或如果您指定您自己的 登录名作为 grantor,则您可在以后使用 REVOKE FRAGMENT 语句来取消您授 予指定的用户的权限。例如,如果您将对 part3 中的 customer 表的分片的 Delete 权限授予用户 martha,但指定用户 jack 作为该权限的授权者,则用户 jack 可从用户 martha 取消那一权限,但您不可从用户 martha 取消那一权限。 DBA,或该分片的所有者,可使用 REVOKE FRAGMENT 语句的 AS 子句取消 对该分片的权限。