GRANT(序列特权)语句
这种格式的 GRANT 语句授予序列上的特权。
调用
此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。
授权
语句授权标识所拥有的特权必须至少包括下列其中一项权限:
- sequence-name 上的每种所识别特权的 WITH GRANT OPTION
- 对于包含 sequence-name 的模式的 ACCESSCTRL 权限
- ACCESSCTRL 或 SECADM 权限
语法
描述
- 用法
- 授予使用 nextval-expression 或 prevval-expression 来引用序列的特权。
- ALTER
- 授予使用 ALTER SEQUENCE 语句来变更序列属性的特权。
- ON SEQUENCE 序列名称
- 识别要在其上授予所指定特权的序列。 序列名称(包括隐式或显式的模式限定符)必须唯一地识别当前服务器上的现有序列。 如果不存在此名称的任何序列,那么会返回错误 (SQLSTATE 42704)。
- TO
- 指定要将所指定特权授予哪个对象。
- 用户
- 指定 authorization-name 识别用户。
- GROUP
- 指定 authorization-name 识别组名。
- 角色
- 指定 authorization-name 识别角色名称。 该角色名称必须存在于当前服务器上 (SQLSTATE 42704)。
- 列示一个或多个用户、组或角色的授权标识。
- PUBLIC
- 将指定的特权授予一组用户(授权标识)。
- WITH GRANT OPTION
- 允许指定的 authorization-name 将所指定特权授予其他用户。如果省略 WITH GRANT OPTION,那么只有在下列情况下,指定的 authorization-name 才能将指定的特权授予其他用户:
- 他们具有 SYSADM 或 DBADM 权限,或者
- 他们已获得从另外其他来源授予所指定特权的能力。
规则
- 对于每个指定的 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)。 如果未授予任何特权,那么会返回错误 (SQLSTATE 42501)。 (如果用于处理该语句的程序包已在 LANGLEVEL 设置为 SQL92E 或 MIA 的情况下进行预编译,那么将返回警告 (SQLSTATE 01007),除非授予者对授予操作的对象不具有任何特权。)
注意
- 授予组的特权:授予组的特权不用于下列各项的授权检查:
- 程序包中的静态 DML 语句
- 处理 CREATE VIEW 语句时的基本表
- 针对具体化查询表来处理 CREATE TABLE 语句时的基本表
- 创建 SQL 例程
- 创建触发器
示例
- 示例 1:将序列 ORG_SEQ 上的 USAGE 特权授予任何用户。
GRANT USAGE ON SEQUENCE ORG_SEQ TO PUBLIC - 示例 2:将变更序列 GENERATE_ID 的能力以及将此特权授予其他用户的能力授予用户 BOBBY。
GRANT ALTER ON SEQUENCE GENERATE_ID TO BOBBY WITH GRANT OPTION
