例程级权限

当您创建用户定义的例程(UDR),您成为该 UDR 的所有者,您自动地获得对那个 UDR 的 Execute 权限。

Execute 权限允许您以 EXECUTE FUNCTION 或 EXECUTE PROCEDURE 语句,任何一个都适用,或以 SPL 例程中的 CALL 语句来调用该 UDR。 Execute 权限还允许您使用表达式中的用户定义的函数,如下示例所示:
SELECT * FROM table WHERE in_stock(partnum) < 20;

对于需要对给定的 UDR 有 Execute 权限的用户、角色或 PUBLIC 组的成员,GRANT 语句支持下列语法:

例程级权限
元素 描述 限制 语法
routine 用户定义的例程 必须存在 标识符
SPL _routine SPL 例程 必须在数据库中是唯一的 标识符
下列语句将对 delete_order 例程的 Execute 权限授予用户 finn
GRANT EXECUTE ON ROUTINE delete_order TO finn;
您是否必须显式地授予 Execute 权限,有赖于下列条件:
  • 如果您有 DBA 级权限,则可使用 CREATE FUNCTION 或 CREATE PROCEDURE 的 DBA 关键字来限定那些有 DBA 权限的用户的缺省 Execute 权限。您必须显式地将对那个 UDR 的 Execute 权限显式地授予那些没有 DBA 权限的用户。
  • 如果您有 Resource 数据库级权限但没有 DBA 权限,则当您创建 UDR 时不可使用 DBA 关键字:
    • 当您在符合 ANSI 的数据库中创建 UDR 时,PUBLIC 可执行那个 UDR。您不需为其他获得 Execute 权限的用户发出 GRANT 语句。
    • 设置 NODEFDAC 环境变量为 yes 以防 PUBLIC 执行 UDR,直到您显式地授予 Execute 权限为止。
  • 在符合 ANSI 的数据库中,UDR 的创建者必须显式地将该 UDR 的 Execute 权限授予其他用户,使之能够执行它。

GBase 8s 中,如果两个或多个 UDR 同名,则使用下列列表中的关键字来指定用户列表可执行那些 UDR 中的哪些。

关键字
用户可执行的 UDR
SPECIFIC
specific name 标识的 UDR
FUNCTION
任何带有指定的 routine name (以及与 routine 参数列表相匹配的参数类型,如果指定的话)的函数
PROCEDURE
任何带有指定的 routine name(以及与参数列表相匹配的参数类型,如果指定的话)的过程
ROUTINE
带有指定的 routine name(以及与例程参数列表相匹配的参数类型,如果指定的话)的函数或过程

如果 GBase 8s 的用户定义的函数和用户定义的过程都有相同的名称和相同的参数数据类型的类表,则可以关键字 ROUTINE 给二者授予 Execute 权限。

要将 Execute 权限限定到有相同标识符的几个例程中的一个,请使用 FUNCTION、PROCEDURE 或 SPECIFIC 关键字。

要将 Execute 权限限定到接受特定数据类型为参数的 UDR,请包括例程参数列表或使用 SPECIFIC 关键字来引入 UDR 的特定名称。

如果外部函数有 negator 函数,则在其他用户可执行该外部函数之前,您必须对外部函数及其 negator 函数都授予 Execute 权限。

用户必须对该语言持有 Usage 权限,该用户定义的例程由该语言编写并以 CREATE FUNCTION、CREATE FUNCTION FROM、CREATE PROCEDURE、CREATE PROCEDURE FROM 或 CREATE ROUTINE FROM 语句来注册 UDR。要获取更多关于注册 UDR 的要求的信息,请参阅 使用 CREATE FUNCTION 时必需的特权

1 请参阅 例程参数列表
2 请参阅 专用名