GRANT(程序包特权)语句

此格式的 GRANT 语句授予对包的特权。

调用

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

权限

语句授权标识所拥有的特权必须至少包括下列其中一项权限:
  • 对引用的程序包的 CONTROL 特权
  • package-name 上每个标识的特权的 WITH GRANT OPTION
  • 包含程序包的模式上的模式 ACCESSCTRL
  • ACCESSCTRL 或 SECADM 权限

ACCESSCTRL 或 SECADM 权限或包含包的模式的模式 ACCESSCTRL 权限是授予 CONTROL 特权所必需的。

语法

Read syntax diagramSkip visual syntax diagramGRANT,BINDCONTROLEXECUTE1ONPACKAGE2 package-name TO ,USERGROUPROLEauthorization-namePUBLIC WITH GRANT OPTION
Notes:
  • 1 RUN can be used as a synonym for EXECUTE.
  • 2 PROGRAM can be used as a synonym for PACKAGE.

描述

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 EMPLOYEE
       GRANT EXECUTE ON PACKAGE
         CORPDATA.PKGA TO USER EMPLOYEE