保守绑定语义
在定义 SQL 对象或处理程序包绑定操作时进行对象解析。
数据库管理器选择要用于 DDL 语句中引用或在应用程序中编码的 SQL 对象的特定定义 SQL 对象。
- 例程-可以定义更适合的新例程或在 SQL 路径中同样适合但较早的新例程; 或者可以授予对更适合或同样适合但在 SQL 路径中较早的现有例程的特权
- 用户定义的数据类型-可以使用相同名称并在 SQL 路径中较早的模式中定义新的用户定义的数据类型
- 全局变量-可以使用相同名称并在 SQL 路径中较早的模式中定义新的全局变量
- 使用公用别名解析的表或视图-可以使用当前模式中的相同名称来定义实际表,视图或专用别名
- 使用公共序列别名解析的序列-可以使用当前模式中的相同名称定义实际序列或专用序列别名
- 解析为公用模块别名的模块-可以在 SQL 路径中的模式中使用相同名称定义实际模块或专用模块别名
- 程序包中的静态 DML 语句
- 视图
- 触发器
- 检查约束
- SQL 例程
- 具有用户定义的类型或缺省表达式的全局变量
- 具有用户定义的参数类型或缺省表达式的例程
对于程序包中的静态 DML 语句,将在绑定操作期间解析 SQL 对象引用。 在定义或重新验证 SQL 对象时,将解析视图,触发器, SQL 例程和检查约束中的 SQL 对象引用。 使用现有静态对象时,将应用 保守绑定语义 ,除非该对象已被数据库模式中的更改标记为无效或不可操作。
保守绑定语义确保将使用先前解析 SQL 对象时使用的相同 SQL 路径,缺省模式和例程集来解析 SQL 对象引用。 它还确保保守绑定解析期间考虑的 SQL 对象定义的时间戳记不晚于上次使用 非保守绑定 语义绑定或验证语句时的时间戳记。 非保守绑定语义使用与原始程序包或语句生成相同的 SQL 路径和缺省模式,但不考虑 SQL 对象定义的时间戳记,也不考虑任何先前解析的例程集。
- 当 SQL 程序包中的静态语句发生此情况时,会将该程序包标记为不可用。 在此程序包中下一次使用语句将导致使用非保守绑定语义隐式地重新绑定程序包,以便能够在考虑导致该程序包不可用的数据库模式的最新更改的情况下解析为 SQL 对象。
- 对视图,触发器,检查约束或 SQL 例程执行此操作时,会将 SQL 对象标记为无效。 下次使用该对象时,将使用非保守绑定语义对 SQL 对象进行隐式重新验证。
请考虑具有两个具有特征符 SCHEMA1.BAR(INTEGER) 和 SCHEMA2.BAR(DOUBLE)。 假定 SQL 路径包含模式 SCHEMA1 和 SCHEMA2 (尽管它们在 SQL 路径中的顺序无关紧要)。 USER1 已被授予对函数 SCHEMA2.BAR(DOUBLE)。 假设 USER1 创建一个调用 BAR (INT_VAL) 的视图,其中 INT_VAL 是使用 INTEGER 数据类型定义的列或全局变量。 视图中的此函数引用解析为函数 SCHEMA2.BAR(DOUBLE) ,因为 USER1 没有对 SCHEMA1.BAR(INTEGER)。 如果 USER1 被授予对 SCHEMA1.BAR(INTEGER) 在创建视图后,该视图将继续使用 SCHEMA2.BAR(DOUBLE) ,除非数据库模式更改导致视图被标记为无效。 如果撤销了必需的特权,或者删除或更改了视图所依赖的对象,那么该视图将被标记为无效。
对于程序包中的静态 DML ,程序包可以隐式地重新绑定,或者通过显式地发出 REBIND 命令 (或相应的 API) 或 BIND 命令 (或相应的 API) 来重新绑定。 隐式重新绑定是通过传统绑定语义执行的(如果该程序包被标记为无效),但它会在程序包标记为不可用时使用非传统绑定语义。 仅当数据包所依赖的索引被删除或改变时,该数据包才会被标记为无效。 REBIND 命令提供了使用保守绑定语义 (RESOLVE 保守) 进行解析的选项,或者通过考虑新的例程,数据类型或全局变量 (RESOLVE ANY ,这是缺省选项) 进行解析的选项。 仅当数据库管理器未将程序包标记为不可用时,才能使用 RESOLVE 保守选项 (SQLSTATE 51028)。
本主题中保守绑定语义的描述假定数据库配置参数 auto_reval 具有 DISABLED 以外的设置。 新数据库的 auto_reval 的缺省设置为 DEFERRED。 对于升级到版本 9.7 的数据库, auto_reval 的缺省设置为 DISABLED。 如果 auto_reval 设置为 DISABLED ,那么保守绑定语义,失效和重新验证行为与版本 9.7之前的发行版中相同。 在 DISABLED 的 auto_reval 设置下,保守绑定语义仅考虑函数,方法,用户定义类型和全局变量的 SQL 对象定义的时间戳记。 对于失效和重新验证行为,这意味着在 DROP , REVOKE 和 ALTER 语句的情况下,语义具有更多限制,或者对从属对象的影响是级联和删除对象。 对于包,大多数数据库模式更改会导致将包标记为无效,并在隐式重新绑定期间使用保守绑定语义。 但是,通过删除从属函数并将 auto_reval 设置为 DISABLED 来更改模式时,依赖于该函数的程序包将标记为不可用,并且不存在隐式重新绑定不可用的程序包。