GRANT(例程特权)语句

这种格式的 GRANT 语句授予并非在模块中定义的例程(函数、方法或过程)上的特权。

调用

此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。

授权

语句授权标识所拥有的特权必须至少包括下列其中一项权限:
  • 该例程上 EXECUTE 的 WITH GRANT OPTION
  • 对于包含例程的模式的 ACCESSCTRL 权限
  • ACCESSCTRL 或 SECADM 权限
要授予模式或类型中的所有例程 EXECUTE 特权,语句授权标识所拥有的特权必须至少包括下列其中一项权限:
  • 所指定模式中指定类型的全部现有及未来例程上 EXECUTE 的 WITH GRANT OPTION
  • 对于包含所有例程的模式的 ACCESSCTRL 权限
  • ACCESSCTRL 或 SECADM 权限

必须具有 SECADM 权限,才能授予审计例程及 SET_MAINT_MODE_RECORD_NO_TEMPORALHISTORY 过程上的 EXECUTE 特权。 对于这些例程,不得授予 EXECUTE 特权 WITH GRANT OPTION (SQLSTATE 42501)。 SET_MAINT_MODE_RECORD_NO_TEMPORALHISTORY 过程上的 EXECUTE 特权不得授予 PUBLIC (SQLSTATE 42501)。

语法

Read syntax diagramSkip visual syntax diagramGRANT EXECUTE ONfunction-designatorFUNCTIONschema.*method-designatorMETHOD * FORtype-nameschema.*procedure-designatorPROCEDUREschema.*TO ,USERGROUPROLEauthorization-namePUBLIC WITH GRANT OPTION
function-designator
Read syntax diagramSkip visual syntax diagramFUNCTIONfunction-name(,data-type)SPECIFIC FUNCTIONspecific-name
method-designator
Read syntax diagramSkip visual syntax diagramMETHODmethod-name(,data-type)FORtype-nameSPECIFIC METHODspecific-name
procedure-designator
Read syntax diagramSkip visual syntax diagramPROCEDUREprocedure-name(,data-type)SPECIFIC PROCEDUREspecific-name

描述

EXECUTE
授予运行所识别的用户定义函数、方法或过程的特权。
函数标识符
唯一地识别要在其上授予特权的函数。 有关更多信息,请参阅 函数,方法和过程指示符
FUNCTION 模式.*
识别模式中的所有函数,包括将来可能创建的任何函数。 在动态 SQL 语句中,如果未指定模式,那么将使用 CURRENT SCHEMA 专用寄存器中的模式。 在静态 SQL 语句中,如果未指定模式,那么将使用 QUALIFIER 预编译/绑定选项中的模式。
方法标识符
唯一地标识方法 授予特权的对象有关更多信息,请参阅 函数,方法和过程指示符
方法 *
识别类型 type-name 的所有方法,包括将来可能创建的任何方法。
对于 type-name
指定在其中找到所指定方法的类型。 该名称必须识别已在目录中描述的类型 (SQLSTATE 42704)。 在动态 SQL 语句中,使用 CURRENT SCHEMA 专用寄存器的值作为未限定的类型名的限定符。 在静态 SQL 语句中,QUALIFIER 预编译/绑定选项隐式地指定未限定的类型名的限定符。 可以使用星号 (*) 代替 type-name 来识别模式中的所有类型,包括将来可能创建的任何类型。
过程标识符
唯一地识别要在其上授予特权的过程有关更多信息,请参阅 函数,方法和过程指示符
PROCEDURE 模式.*
识别模式中的所有过程,包括将来可能创建的任何过程。 在动态 SQL 语句中,如果未指定模式,那么将使用 CURRENT SCHEMA 专用寄存器中的模式。 在静态 SQL 语句中,如果未指定模式,那么将使用 QUALIFIER 预编译/绑定选项中的模式。
TO
指定要将 EXECUTE 特权授予哪个对象。
用户
指定 authorization-name 识别用户。
GROUP
指定 authorization-name 识别组名。
角色
指定 authorization-name 识别角色名称。 该角色名称必须存在于当前服务器上 (SQLSTATE 42704)。
授权名称
列示一个或多个用户、组或角色的授权标识。
PUBLIC
将 EXECUTE 特权授予一组用户(授权标识)。
WITH GRANT OPTION
允许指定的 authorization-name 将 EXECUTE 特权授予 (GRANT) 其他用户。
如果省略 WITH GRANT OPTION,那么只有在下列情况下,指定的 authorization-name 才能将 EXECUTE 特权授予其他用户:
  • 他们具有 SYSADM 或 DBADM 权限,或者
  • 他们已获得从另外其他来源授予 EXECUTE 特权的能力。

规则

  • 无法授予使用模式“SYSIBM”或“SYSFUN”定义的函数或方法上的 EXECUTE 特权 (SQLSTATE 42832)。
  • 对于每个指定的 authorization-name,如果 USER、GROUP 或 ROLE 均未指定,那么:
    • 如果对实例有效的安全插件无法确定 authorization-name 的状态,那么会返回错误 (SQLSTATE 56092)。
    • 如果 authorization-name 在数据库中定义为 ROLE,并根据有效的安全插件定义为 GROUP 或 USER,那么会返回错误 (SQLSTATE 56092)。
    • 如果 authorization-name 根据有效的安全插件同时定义为 USER 和 GROUP,那么会返回错误 (SQLSTATE 56092)。
    • 如果 authorization-name 根据有效的安全插件仅定义为 USER,或者未定义,那么假定为 USER。
    • 如果 authorization-name 根据有效的安全插件仅定义为 GROUP,那么假定为 GROUP。
    • 如果 authorization-name 在数据库中仅定义为 ROLE,那么假定为 ROLE。
  • 通常,GRANT 语句会处理语句授权标识有权授予的特权的授予,并在未授予一项或多项特权时返回警告 (SQLSTATE 01007)。 如果用于处理该语句的程序包已在 LANGLEVEL 设置为 SQL92E 或 MIA 的情况下进行预编译,并且未授予任何特权,那么将返回警告 (SQLSTATE 01007)。 如果授予者在授予操作的对象上不具有任何特权,那么会返回错误 (SQLSTATE 42501)。

注意

  • 模块中定义的例程的特权可使用 GRANT(模块特权)语句在模块级别授予。 该模块上的 EXECUTE 特权允许访问该模块中的所有对象。
  • 授予组的特权:授予组的特权不用于下列各项的授权检查:
    • 程序包中的静态 DML 语句
    • 处理 CREATE VIEW 语句时的基本表
    • 针对具体化查询表来处理 CREATE TABLE 语句时的基本表
    • 创建 SQL 例程
    • 创建触发器

示例

  • 示例 1:将函数 CALC_SALARY 上的 EXECUTE 特权授予用户 JONES。 假定该模式中只有一个名为 CALC_SALARY 的函数。
       GRANT EXECUTE ON FUNCTION CALC_SALARY TO JONES
  • 示例 2:将过程 VACATION_ACCR 上的 EXECUTE 特权授予当前服务器上的所有用户。
       GRANT EXECUTE ON PROCEDURE VACATION_ACCR TO PUBLIC
  • 示例 3:将函数 DEPT_TOTALS 上的 EXECUTE 特权授予行政助理,并使其有能力将此函数上的 EXECUTE 特权授予其他用户。 该函数具有特定名称 DEPT85_TOT。 假定该模式中存在多个名为 DEPT_TOTALS 的函数。
       GRANT EXECUTE ON SPECIFIC FUNCTION DEPT85_TOT
         TO ADMIN_A WITH GRANT OPTION
  • 示例 4:将函数 NEW_DEPT_HIRES 上的 EXECUTE 特权授予 HR(人力资源)。 该函数有两个输入参数,其类型分别为 INTEGER 和 CHAR(10)。 假定该模式中存在多个名为 NEW_DEPT_HIRES 的函数。
       GRANT EXECUTE ON FUNCTION NEW_DEPT_HIRES (INTEGER, CHAR(10)) TO HR
  • 示例 5:将类型 EMPLOYEE 的方法 SET_SALARY 上的 EXECUTE 特权授予用户 JONES。
       GRANT EXECUTE ON METHOD SET_SALARY FOR EMPLOYEE TO JONES