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)。
语法
描述
- 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
