GRANT(程序包特权)语句
此格式的 GRANT 语句授予对包的特权。
调用
此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。
权限
语句授权标识所拥有的特权必须至少包括下列其中一项权限:
- 对引用的程序包的 CONTROL 特权
- package-name 上每个标识的特权的 WITH GRANT OPTION
- 包含程序包的模式上的模式 ACCESSCTRL
- ACCESSCTRL 或 SECADM 权限
ACCESSCTRL 或 SECADM 权限或包含包的模式的模式 ACCESSCTRL 权限是授予 CONTROL 特权所必需的。
语法
描述
- BIND
- 授予绑定程序包的特权。 BIND 特权允许用户对该程序包重新发出 BIND 命令,或发出 REBIND 命令。 它还允许用户创建现有软件包的新版本。
除了 BIND 特权外,用户还必须拥有程序中包含的静态 DML 语句所引用的每个表的必需特权。 这是必需的,因为在绑定时将检查对静态 DML 语句的授权。
- CONTROL
- 授予特权以重新绑定、删除或执行数据包,以及将数据包特权扩展到其他用户。 程序包的 CONTROL 特权将自动授予程序包的创建者。 程序包所有者是程序包绑定程序,或者是在绑定/预编译时使用 OWNER 选项指定的标识。
会自动将 BIND 和 EXECUTE 授予被授予 CONTROL 特权的 authorization-name 。
CONTROL 授予向其他用户授予先前提及的特权 (CONTROL 除外) 的能力。
- EXECUTE
- 授予执行包的特权。
- ON PACKAGE package-name
- 指定要授予特权的包的名称。 包特权的授予适用于包的所有版本 (即,适用于共享相同包名和包模式的所有包)。
- TO
- 指定要将特权授予哪个对象。
- 用户
- 指定 authorization-name 识别用户。
- GROUP
- 指定 authorization-name 识别组名。
- 角色
- 指定 authorization-name 识别角色名称。 该角色名称必须存在于当前服务器上 (SQLSTATE 42704)。
- authorization-name , ...
- 列示一个或多个用户、组或角色的授权标识。
授权标识列表不得包括发出该语句的用户的授权标识 (SQLSTATE 42502)。
- PUBLIC
- 将特权授予一组用户(授权标识)。 有关更多信息,请参阅
授权、特权和对象所有权
。 - WITH GRANT OPTION
- 允许指定的 authorization-name 将特权授予他人。
如果指定的特权包括 CONTROL ,那么 WITH GRANT OPTION 将应用于除 CONTROL 以外的所有适用特权 (SQLSTATE 01516)。
规则
- 对于每个指定的 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。
注意
- 程序包特权适用于程序包的所有版本 (即,共享相同程序包标识和程序包模式的所有程序包)。 无法将访问权限制为只有一个版本。 因为 CONTROL 特权隐式授予程序包的绑定程序,所以如果两个不同的用户绑定程序包的两个版本,那么将隐式授予两个用户对彼此的程序包的访问权。
- 授予组的特权:授予组的特权不用于下列各项的授权检查:
- 程序包中的静态 DML 语句
- 处理 CREATE VIEW 语句时的基本表
- 针对具体化查询表来处理 CREATE TABLE 语句时的基本表
- 创建 SQL 例程
- 创建触发器
示例
- 示例 1: 授予对 PACKAGE CORPDATA.PKGA 到 PUBLIC。
GRANT EXECUTE ON PACKAGE CORPDATA.PKGA TO PUBLIC - 示例 2: 对包 CORPDATA.PKGA 到名为 EMPLOYEE 的用户。 既没有组,也没有名为 EMPLOYEE 的用户。
或GRANT EXECUTE ON PACKAGE CORPDATA.PKGA TO EMPLOYEEGRANT EXECUTE ON PACKAGE CORPDATA.PKGA TO USER EMPLOYEE
