DYNAMICRULES 绑定选项
DYNAMICRULES选项用于确定某些动态SQL属性在运行时适用的规则。
| 命令选项 | 选项价值 | 搭配 |
|---|---|---|
| 动态规则 |
|
- DYNAMICRULES 绑定选项对于本机 SQL 过程、 本机 REST 服务或高级触发器的包的 REBIND 无效。
- 指定了会员选项。 在这种情况下,生成的包将继承BIND PLAN命令中的DYNAMICRULES值。 如果为REBIND PLAN指定了DYNAMICRULES,则DYNAMICRULES值不起作用。
- 现有包没有DYNAMICRULES值。 如果发出具有 DYNAMICRULES 值的绑定计划,且包列表中包含一个没有 DYNAMICRULES 值的包,则该包在运行时从计划中继承 DYNAMICRULES 值。
如果为“重新绑定计划”指定了“动态规则”,则只有在现有程序包没有“动态规则”值时,“动态规则”值才会生效。 如果发布具有动态规则值的重新绑定计划,且软件包列表中包含没有动态规则值的软件包,则软件包在运行时将从计划中继承动态规则值。
- 用于检查授权的授权标识
- 用于不合格对象的限定符
- Db2 用于解析和语义验证动态SQL语句的应用程序编程选项的源文件
- 动态 SQL 语句是否可以包括 GRANT、REVOKE、ALTER、CREATE、DROP 和 RENAME 语句
- 程序包作为独立程序的组成部分运行
- 该包作为存储过程或用户定义的函数包运行,或在存储过程或用户定义的函数下运行
DYNAMICRULES 值与运行时环境共同确定动态 SQL 属性的值。 这一组属性值被称为动态 SQL 语句行为。 这四种行为分别是:运行、绑定、定义和调用。
以下DYNAMICRULES选项描述包括对每个运行环境下的动态SQL语句行为的描述。 表1 汇总了这些信息。
选项说明 DYNAMICRULES
- (RUN)
- 使用动态 SQL 语句的标准属性值处理动态 SQL 语句,统称为运行行为 :
- Db2 使用应用程序流程的授权ID和SQL授权ID(CURRENT SQLID特殊寄存器的值)对动态SQL语句进行授权检查。
- Db2 使用当前模式特殊寄存器的值作为表、视图、索引和别名的默认模式。
- 动态 SQL 语句使用在安装过程中指定的应用程序编程选项的值。 安装选项“用于动态规则”不起作用。
- GRANT、REVOKE、CREATE、ALTER、DROP和RENAME语句可以动态执行。
- DYNAMICRULES(BIND)
- 使用以下属性值处理动态 SQL 语句,这些属性值统称为绑定行为 :
- Db2 使用包的授权ID对动态SQL语句进行授权检查。
- 动态 SQL 语句中的无限制表、视图、索引和别名会隐式使用绑定选项 QUALIFIER 的值进行限定;如果您未指定 QUALIFIER,则 Db2 会使用包所有者的授权 ID 作为默认架构。
- 绑定、定义和调用行为的常见属性值中描述的属性值。
- 如果您正在运行一个可信的上下文,其中包含一个角色,或者所有者是一个角色,则 Db2 将使用包所有者的授权ID来检查动态SQL语句的授权。 用于确定静态(嵌入式)语句授权ID的规则同样适用于动态语句。 Db2 使用数据包所有者的授权ID来检查动态SQL语句的授权。 特权集是指由套餐所有者授权ID持有的特权。 主人也可以是一个角色。 绑定命令的QUALIFIER选项中指定的标识符用于绑定SQL语句,它是所有非限定表、视图、别名、索引和序列的隐式限定符。 如果在创建软件包或上次重新绑定时未使用此绑定选项,则隐式限定符为软件包所有者的授权ID。 主人也可以是一个角色。
- DYNAMICRULES(DEFINEBIND)
- 使用两种行为之一处理动态 SQL 语句: 定义行为或绑定行为。当包以存储过程或用户定义的函数包的形式运行或在其下运行时, Db2 会使用定义行为处理动态SQL语句,该行为由以下属性值组成:
- Db2 使用用户定义函数或存储过程所有者的授权ID,对应用程序包中的动态SQL语句进行授权检查。
- 非限定对象的默认限定符为用户定义的函数或存储过程的所有者。
- 绑定、定义和调用行为的常见属性值中描述的属性值。
- 如果您正在运行一个受信任的上下文,其中包含一个角色,或者所有者是一个角色,则定义行为仅适用于动态 SQL 语句位于作为存储过程或用户定义函数运行的包中(或在存储过程或用户定义函数包下运行),并且该包与 DYNAMICRULES(DEFINEBIND)绑定。 Db2 使用存储过程或用户定义函数所有者的授权ID,对应用程序包中的动态SQL语句进行授权检查。 这可以是主授权ID、次授权ID或角色。 在这种情况下,特权集是指存储过程或用户定义函数所有者的授权ID所拥有的特权。 此所有者可以是主要或次要授权ID或角色。 存储过程或用户定义函数所有者的授权ID也是非限定表、视图、别名、索引和序列名称的隐式限定符。 主人也可以是一个角色。
当程序包作为独立程序运行时, Db2 使用绑定行为处理动态SQL语句,绑定行为在 BIND关键字中进行了描述。
- DYNAMICRULES(DEFINERUN)
- 使用两种行为之一处理动态 SQL 语句 :定义行为或运行行为。
当包以存储过程或用户定义的函数包的形式运行时,动态 SQL 语句具有定义行为,这在 DEFINEBIND 关键字中进行了描述。
当程序包作为独立程序运行时, Db2 会使用运行行为处理动态SQL语句,运行行为在 RUN关键字中进行了描述。
如果您正在运行一个受信任的上下文,其中包含一个角色,或者所有者是一个角色,则定义行为仅适用于动态 SQL 语句位于作为存储过程或用户定义函数运行的包中(或在存储过程或用户定义函数包下运行),并且该包与 DYNAMICRULES(DEFINERUN)绑定。 Db2 使用存储过程或用户定义函数所有者的授权ID,对应用程序包中的动态SQL语句进行授权检查。 这可以是主授权ID、次授权ID或角色。 在这种情况下,特权集是指存储过程或用户定义函数所有者的授权ID所拥有的特权。 此所有者可以是主要或次要授权ID或角色。 存储过程或用户定义函数所有者的授权ID也是非限定表、视图、别名、索引和序列名称的隐式限定符。 主人也可以是一个角色。
- DYNAMICRULES(INVOKEBIND)
- 使用两种行为之一处理动态 SQL 语句: 调用行为或绑定行为。当包以存储过程或用户定义的函数包的形式运行或在其下运行时, Db2 使用invoke行为处理动态SQL语句,该行为由以下属性值组成:
- Db2 使用用户定义函数或存储过程调用者的授权ID,用于应用程序包中动态SQL语句的授权检查。
如果调用者是该进程的主要授权ID或当前SQLID值,则还会检查次要授权ID,以确定是否需要它们进行所需授权。 否则,仅检查调用者的ID,以确定是否具有所需的授权。
- 非限定对象的默认限定符是用户定义的函数或存储过程调用器。
- 绑定、定义和调用行为的常见属性值中描述的属性值。
- 如果您正在运行一个受信任的上下文,其中包含一个角色,或者所有者是一个角色,那么只有在动态 SQL 语句位于作为存储过程或用户定义函数运行的包中(或在存储过程或用户定义函数包下运行),并且该包与 DYNAMICRULES(INVOKEBIND)绑定时,调用行为才适用。 Db2 使用存储过程或用户定义函数的授权ID,用于应用程序包中动态SQL语句的授权检查。 调用者也可以是一个角色。 特权集是指存储过程或用户定义函数调用者的授权ID所拥有的特权。 但是,如果调用者是该进程的主要授权ID或当前SQLID值,则还会检查次要授权ID以及主要授权ID的角色。 因此,特权集是流程中每个授权ID所拥有的一组特权与主要授权ID角色的结合。 存储过程或用户定义的函数调用者的授权ID也是非限定表、视图、别名、索引和序列名称的隐式限定符。 调用者也可以是一个角色。
当程序包作为独立程序运行时, Db2 使用绑定行为处理动态SQL语句,绑定行为在 BIND关键字中进行了描述。
- Db2 使用用户定义函数或存储过程调用者的授权ID,用于应用程序包中动态SQL语句的授权检查。
- DYNAMICRULES(INVOKERUN)
- 使用两种行为之一处理动态 SQL 语句: 调用行为或运行行为。
当包以存储过程或用户定义的函数包的形式运行或在其下运行时, Db2 使用invoke行为处理动态SQL语句,这在 INVOKEBIND关键字中进行了描述。
如果您正在运行一个受信任的上下文,其中包含一个角色,或者所有者是一个角色,那么只有在动态 SQL 语句位于作为存储过程或用户定义函数运行的包中(或在存储过程或用户定义函数包下运行),并且该包与 DYNAMICRULES(INVOKERUN)绑定时,调用行为才适用。 Db2 使用存储过程或用户定义函数的授权ID,用于应用程序包中动态SQL语句的授权检查。 调用者也可以是一个角色。 特权集是指存储过程或用户定义函数调用者的授权ID所拥有的特权。 但是,如果调用者是该进程的主要授权ID或当前SQLID值,则还会检查次要授权ID以及主要授权ID的角色。 因此,特权集是流程中每个授权ID所拥有的一组特权与主要授权ID角色的结合。 存储过程或用户定义的函数调用者的授权ID也是非限定表、视图、别名、索引和序列名称的隐式限定符。 调用者也可以是一个角色。
当程序包作为独立程序运行时, Db2 会使用运行行为处理动态SQL语句,运行行为在 RUN关键字中进行了描述。
绑定、定义和调用行为的常见属性值
- 您可以在绑定任何DYNAMICRULES值的程序包中执行语句SET CURRENT SQLID。 然而, Db2 不会将当前SQLID的值用作动态SQL语句的授权ID。
Db2 总是使用当前 SQLID 的值作为 EXPLAIN 输出的限定符和优化器提示输入 PLAN_TABLE。 (如果当前 SQLID 的值在 PLAN_TABLE 上有一个别名,并且具有相应的权限,则 PLAN_TABLE 将被填充。)
- 如果安装选项 USE FOR DYNAMICRULES 的值为 YES,则 Db2 使用安装期间指定的应用程序编程默认值来解析和语义验证动态 SQL 语句。 如果DYNAMICRULES的USE值为NO, Db2 将使用预编译器选项来解析和语义验证动态SQL语句。
- GRANT、REVOKE、CREATE、ALTER、DROP和RENAME语句不能动态执行。
远程 Db2 服务器
对于使用DRDA访问的包, Db2 在绑定时将DYNAMICRULES选项发送到 Db2 服务器。
动态规则行为和动态SQL属性
下表总结了每种行为的动态SQL语句属性值。
| 动态 SQL 属性 | 约束行为价值 | 运行行为价值 | 定义行为的价值 | 调用行为的价值 |
|---|---|---|---|---|
| 授权标识 | 程序包所有者 | CURRENT SQLID | 用户定义函数或存储过程所有者 | 调用者的授权ID |
| 未限定的对象的缺省限定符 | 绑定所有者或限定词值 | CURRENT SQLID | 用户定义函数或存储过程所有者 | 调用者的授权ID |
| CURRENT SQLID | 初始化为主要身份验证。 允许设置 SQLID。 | 初始化为主要身份验证。 允许设置 SQLID。 | 初始化为主要身份验证。 允许设置 SQLID。 | 初始化为主要身份验证。 允许设置 SQLID。 |
| 应用程序编程选项的来源 | 由应用程序默认参数 DYNRULS 确定 | 应用程序编程默认安装面板 | 由应用程序默认参数 DYNRULS 确定 | 由应用程序默认参数 DYNRULS 确定 |
| 可以执行GRANT、REVOKE、CREATE、ALTER、DROP、RENAME吗? | False | 是 | False | False |
默认值 DYNAMICRULES
目录记录 DYNAMICRULES
请参阅SYSPACKAGE目录表和 SYSPLAN目录表中的DYNAMICRULES列。