表级权限
当您以 CREATE TABLE 语句创建表时,您是该表的所有者,且自动地收到所有的表级权限。您不可将所有权转给另一用户,但您可将表级权限授予另一用户或授予一角色。(然而, 请参阅 RENAME TABLE 语句,它可更改表的名称和所有权。)
有数据库级 DBA 权限的用户自动地收到那个数据库中每一表的所有表级权限。
表级权限

元素 | 描述 | 限制 | 语法 |
column | 授予对列的 References、Select 或 Update 权限。缺省的范围是 table、view 或 synonym 的所有列。 | 必须为 table、view 或 synonym 的列 | 标识符 |
owner | 拥有该 table、view 或 synonym 的用户名称 | 必须为有效的授权标识符 | 所有者名称 |
synonym, table, view | 授予权限的同义词、表或视图。 | 在当前数据库中必须存在 | 标识符 |
GRANT 语句可罗列下列关键字中一个或多个,来指定您授予同样的用户或角色的表权限。
权限 | 作用 |
INSERT | 让您插入行 |
DELETE | 让您删除行 |
SELECT | 让您访问 SELECT 语句中的任何列。您可通过罗列列来将 Select 权限限定到一列或多列。 |
UPDATE | 让您访问 UPDATE 语句中的任何列。您可通过罗列列来将 Update 权限限定到到一列或多列。 |
REFERENCES | 让您定义对列的引用约束。您必须有 Resource 权限来利用 References 权限。(然而,您可在 ALTER TABLE 语句期间添加参考约束,而无需持有数据库的 Resource 权限。)您仅需 References 权限来指出级联删除。您无需 Delete 权限来在表上放置级联删除。您可通过罗列列来将 References 权限限定到一列或多列。 |
INDEX | 让您创建永久索引。您必须有 Resource 权限来使用 Index 权限。(有 Connect 权限的任何用户可在临时表上创建索引。) |
ALTER | 让您添加或删除列,修改列数据类型,添加或删除约束,将表的锁定模式由 PAGE 修改为 ROW,或为您的表添加或删除对应的 ROW 数据类型。 它还让您启用或禁用索引、约束和触发器,如 SET Database Object Mode 语句 中所描述。 您必须有 Resource 权限来使用 Alter 权限。此外,对于受 ALTER TABLE 语句影响的任何用户定义的数据类型,您还需要 Usage 权限。 |
UNDER | 让您创建类型表之下的子表。 |
ALL | 提供以上列出的所有权限。PRIVILEGES 关键字是可选的。 |
您可通过指定权限适用的列来缩小 Select、Update 或 References 权限的范围。
指定关键字 PUBLIC 为 user,如果您想要 GRANT 语句应用于所有用户。
以下一些简单的示例展示如何以 GRANT 语句来授予表级权限。
下列语句将删除和选择表 customer 中的任何列的值的权限授予用户 mary 和 john。它还授予 Update 权限,但仅限于列 customer_num、fname 和 lname:
GRANT DELETE, SELECT, UPDATE (customer_num, fname, lname)
ON customer TO mary, john;
要将上述相同的权限授予给所有授权的用户,请使用关键字 PUBLIC,如下列示例所示:
GRANT DELETE, SELECT, UPDATE (customer_num, fname, lname)
ON customer TO PUBLIC;
对于 GBase 8s 数据库,假设名为 mary 的用户已经创建了名为 tab1 的类型表。在缺省情况下,仅用户 mary 可创建 tab1 表之下的子表。如果 mary 想要将在 tab1 表之下创建子表的能力授予名为 john 的用户,则 mary 必须输入下列 GRANT 语句:
GRANT UNDER ON tab1 TO john;
收到 tab1 表上的 Under 权限之后,用户 john 可创建 tab1 之下的一个或多个子表。
ALL 关键字的作用
ALL 关键字将所有可能的表级权限授予指定的用户。如果对于 grantor 任何或所有表级权限都不存在,则带有 ALL 关键字的 GRANT 语句成功(如同 SQLCODE 设置为零,即使对于 grantor 在表上可能的权限设置为空)。然而,在这种情况下,返回下列 SQLSTATE 警告:
01007 - Privilege not granted.
例如,假设用户 ted 在 customer 上有 Select 和 Insert 权限,将那些权限授予其他用户。
用户 ted 想要将所有表级权限授予用户 tania。因此,用户 ted 发出下列 GRANT 语句:
GRANT ALL ON customer TO tania;
此语句成功地执行,但由于下列原因返回 SQLSTATE 代码 01007:
l 该语句成功地将 Select 和 Insert 权限授予用户 tania,因为用户 ted 有那些权限和将那些权限授予其他用户的权利。
l ALL 关键字暗含的其他权限不可由 ted 授予,因此没有授予用户 tania。
如果您以 ALL 关键字授予所有表级权限,则仅当该表为类型表时该权限才包括 Under 权限。ALL 权限的授予不包括 Under 权限,如果该表不是基于 ROW 类型的。
如果表所有者授予传统的关系表 ALL 权限,并在后来将那个表更改为类型表,则表所有者必须明确地授予 Under 权限来允许其他用户创建它之下的子表。
表引用
通过制定表的或视图的名称或现有的同义词,您直接授予表级权限,可以 owner 名称来限定。
表引用

元素 | 描述 | 限制 | 语法 |
owner | 拥有 table、view 或 synonym 的用户的名称 | 必须为有效的授权标识符 | 所有者名称 |
synonym, table, view | 对其授予权限的同义词、表或视图 | table、view 或 synonym 必须在数据库中存在 | 标识符 |
对其授予权限的对象必须位于当前数据库中。
对于 CREATE EXTERNAL TABLE 语句已经在当前数据库中注册的表对象,支持 Select 权限和 Insert 权限,但不可授予或取消对其他表或列的访问权限。
在符合 ANSI 的数据库中,如果 owner 未加引号,则数据库以小写字母方式存储所有者名称。




