Usage 权限
任何用户都可引用 SQL 语句中的内建的数据类型,但不可引用基于内建的数据类型的 DISTINCT 数据类型。用户定义的数据类型的创建者或 DBA 必须显式地授予对 UDT 的 Usage 权限,包括基于内建的数据类型的 DISTINCT 数据类型。
带有 USAGE ON TYPE 关键字的 REVOKE 移除您稍早授予另一用户、PUBLIC 或角色的 Usage 权限。
下列语句从用户 mark 移除使用 widget 用户定义的类型的权限:
REVOKE USAGE ON TYPE widget FROM mark;
Under 权限
您拥有您创建的任何命名的 ROW 数据类型。如果您想要其他用户能够在此命名的 ROW 类型之下创建子类型,则您必须授予这些用户对于您的命名的 ROW 类型的 Under 权限。如果您稍后想要移除这些用户在该命名的 ROW 类型之下创建子类型的能力,则您必须从这些用户取消 Under 权限。带有 UNDER ON TYPE 关键字的 REVOKE 语句移除您稍早授予这些用户的 Under 权限。
例如,假设您创建了名为 rtype1 的 ROW 类型:
CREATE ROW TYPE rtype1 (cola INT, colb INT);
如果您想要另一名为 kathy 的用户能够在此命名的 ROW 类型之下创建子类型,则您必须将对于此命名的 ROW 类型的 Under 权限授予用户 kathy:
GRANT UNDER ON TYPE rtype1 TO kathy;
现在,即使 kathy 不是 rtype1 ROW 类型的所有者,用户 kathy 也可在 rtype1 ROW 类型之下创建另一 ROW 类型:
CREATE ROW TYPE rtype2 (colc INT, cold INT) UNDER rtype1;
如果您稍后想要移除用户 kathy 在 rtype1 ROW 类型之下创建子类型的能力,则请输入下列语句:
REVOKE UNDER ON TYPE rtype1 FROM kathy;
例程级权限
如果您从用户取消对 UDR 的 Execute 权限,则那个用户不可再以任何方式执行那个 UDR。要获取用户可如何执行 UDR 的详细信息,请参阅 例程级权限。
例程级权限
元素 | 描述 | 限制 | 语法 |
routine | 用户定义的例程 | 必须存在 | 标识符 |
SPL_routine | SPL 例程 | 在该数据库中必须为唯一的 | 标识符 |
在符合 ANSI 的数据库中,owner 名称必须限定 routine 名称,除非发出 REVOKE 语句的用户为该例程的所有者。
下列示例取消用户 mark 对由 luke 所拥有的 delete_order 例程的 Execute 权限:
REVOKE EXECUTE ON ROUTINE luke.delete_order FROM mark;
在 GBase 8s 中,任何您授予 Execute 权限的取反函数都需要单独的、显式的 REVOKE 语句。
当您在任何下列环境之下创建 UDR,都不会缺省地授予 PUBLIC Execute 权限。因此,在您可取消它之前,您必须显式地授予 Execute 权限:
- 您在符合 ANSI 的数据库中创建 UDR。
- 您有 DBA 权限且在 CREATE 关键字之后指定 DBA 来将 Execute 权限限定给拥有 DBA 数据库级权限的用户。
- NODEFDAC 环境变量设置为 yes 来防止 PUBLIC 收到任何未被显式地授予的权限。
但如果您在没有任何那些条件生效的情况下创建 UDR,则 PUBLIC 可无需 GRANT EXECUTE 语句即可执行您的 UDR。要限定谁可执行您的 UDR,请通过 FROM PUBLIC 取消 Execute 权限,并将它授予用户(请参阅 用户列表)或角色(请参阅 角色名称)。
在 GBase 8s 中,如果两个或多个 UDR 有相同的名称,则请从此列表使用关键字来指定用户列表可不再执行那些 UDR 中的哪些。
关键字 防止用户执行的 UDR
SPECIFIC 通过 specific name 标识的 UDR
FUNCTION 任何带有指定的 routine name 的函数(以及与 routine 参数列表相匹配的参数类型,如果指定的话)
PROCEDURE 任何带有指定的 routine name 的过程(以及与 routine 参数列表相匹配的参数类型,如果指定的话)
ROUTINE 带有指定的 routine name 的函数或过程(以及与 routine 参数列表相匹配的参数类型,如果指定的话)