授权ID和动态SQL

绑定选项DYNAMICRULES决定授权ID,用于在处理动态SQL语句时检查授权。 授权ID和其他动态SQL属性的值集称为动态SQL语句行为。 四种可能的行为是运行、绑定、定义和调用。

此讨论适用于引用当前服务器上对象的动态 SQL 语句。 关于在其他地方引用对象的信息,请参阅授权ID和远程执行

除了确定授权ID,DYNAMICRULES还控制其他动态SQL属性,例如用于非限定别名、索引、序列、表、触发器和视图名称的隐式限定符;应用程序编程选项的源;以及某些SQL语句是否可以动态调用。

如下表所示,DYNAMICRULES选项的值和运行环境共同决定使用四种动态SQL语句行为中的哪一种。 默认情况下,DYNAMICRULES(RUN)表示运行行为。
表 1. DYNAMICRULES 和运行时环境如何确定动态 SQL 语句行为
DYNAMICRULES 值 动态SQL语句的行为
独立程序环境 用户定义函数或存储过程环境
运行 运行 运行
BIND 绑定 绑定
DEFINERUN 运行 定义
DEFINEBIND 绑定 定义
INVOKERUN 运行 调用
INVOKEBIND 绑定 调用
注意 :可以为包、计划以及本机 SQL 过程指定绑定和运行值。 其他值可以指定给包和本机SQL过程,但不能指定给计划。

在下列行为描述中,在用户定义函数或存储过程包下运行的包是其关联程序满足下列条件之一的包:

  • 该程序由用户定义的函数或存储过程调用。
  • 该程序由一系列嵌套调用组成,以用户定义的函数或存储过程开始。
运行行为
Db2 使用应用程序流程的授权ID和SQL授权ID(特殊寄存器CURRENT SQLID的值)对动态SQL语句进行授权检查。 如果进程在可信环境中运行,且角色与主授权 ID 相关联,则应用程序进程的授权 ID 包含此角色。

使用计划及其相关软件包的过程称为应用过程。 在任何时候,SQL授权ID都是CURRENT SQLID的值。 此 SQL 特殊寄存器可通过连接或登录退出例程进行初始化。 如果退出例程未设置值,则 CURRENT SQLID 的初始值为流程的主授权 ID。 您可以使用 SQL 语句 SET CURRENT SQLID 来更改 CURRENT SQLID 的值。 除非进程的某些授权ID具有SYSADM权限,否则新值必须是进程的授权ID之一。 因此,当前SQLID通常包含流程的主授权ID或其辅助授权ID之一。 当前SQLID不能包含角色。

更改开始特权套装更改结束
更改开始 如果动态准备的语句不是CREATE、GRANT或REVOKE语句,则语句所需的每个权限都可以是进程的任何授权ID指定的权限。 因此,特权集是流程中每个授权ID所拥有的一组特权的组合。 当进程在可信环境中运行时,进程的授权ID中包含该角色。

更改开始如果动态 SQL 语句是 CREATE、GRANT 或 REVOKE 语句,则用于授权检查的唯一授权 ID 是 SQL 授权 ID。 因此,特权集是指流程中单个授权ID所拥有的特权。 如果进程在可信环境中运行,且在 CREATE、GRANT 或 REVOKE 语句中使用 ROLE AS OBJECT OWNER 子句,则被检查的进程的唯一授权 ID 就是当前有效的角色。更改结束

更改结束
隐性资格
当动态准备 SQL 语句时,CURRENT SCHEMA 特殊寄存器的值将作为隐式限定符。 例如,它被用作所有非限定表、别名、视图、索引和序列的隐式限定符。 更多信息,请参阅 “非限定对象名称解析 ”。
绑定行为
用于确定静态(嵌入式)语句授权ID的规则同样适用于动态语句。 Db2 使用包或计划所有者的授权ID来检查动态SQL语句的授权,如授权ID和语句准备中所述。
特权套装
特权集是指套餐或计划的所有者享有的特权。
隐性资格
绑定命令的QUALIFIER选项中指定的标识符用于绑定SQL语句,或用于创建SQL程序版本的CREATE PROCEDURE或ALTER PROCEDURE语句,它是所有非限定表、视图、别名、索引和序列的隐式限定符。 如果在创建或最后修改计划、包或本机 SQL 过程时未使用 QUALIFIER 选项,则计划、包或本机 SQL 过程的所有者是隐式限定符。
定义行为
仅当动态 SQL 语句位于作为存储过程或用户定义函数运行的包中(或在存储过程或用户定义函数包下运行 ),并且该包与 DYNAMICRULES(DEFINEBIND) 或 DYNAMICRULES(DEFINERUN) 绑定时,定义行为才适用。 Db2 使用存储过程或用户定义函数所有者(定义者)的授权ID,对应用程序包中的动态SQL语句进行授权检查。
特权套装
特权集是指车主授权ID所拥有的特权。
隐性资格
存储过程或用户定义的函数的所有者也是隐式限定符。 例如,对于无限制的表、视图、别名、索引和序列名称,所有者是隐含的限定符。
调用行为
仅当动态 SQL 语句位于作为存储过程或用户定义函数运行的包中(或在存储过程或用户定义函数包下运行 ),并且该包与 DYNAMICRULES(INVOKEBIND) 或 DYNAMICRULES(INVOKERUN) 绑定时,调用行为才适用。 Db2 使用存储过程或用户定义的函数调用器对应用程序包中的动态 SQL 语句进行授权检查。 调用者也可以是一个角色。
特权套装
特权集是调用者拥有的特权。 但是,如果调用者是该进程的主要授权ID或当前SQLID值,则也会检查次要授权ID。 这包括主要授权ID的角色,如果在一个可信的环境中运行,并具有角色。 在这种情况下,特权集是流程中每个授权ID所拥有特权集的合并。
隐性资格
存储过程或用户定义的函数调用器也是隐式限定符。 例如,它是无限制的表、视图、别名、索引和序列名称的隐式限定符。 调用者也可以是一个角色。

运行行为不适用时,限制性语句

当绑定、定义或调用行为生效时,您不能使用以下动态 SQL 语句:ALTER、CREATE、COMMENT、DROP、GRANT、RENAME 和 REVOKE。