ALTER FUNCTION 语句(SQL 表函数)
ALTER FUNCTION(SQL表)语句用于更改当前服务器上用户定义的SQL表函数的描述。
调用ALTER FUNCTION(SQL表)
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
ALTER FUNCTION(SQL表)授权
以下定义的特权集必须至少包含以下特权或权限之一:
- 拥有该功能
- 架构上的ALTERIN权限
- SYSADM 权限
- SYSCTRL 权限
- 系统 DBADM
安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
与模式名称匹配的授权ID隐式拥有该模式的ALTERIN权限。
如果用于更改函数的授权ID具有安装SYSADM权限或安装SYSOPR权限,并且当前SQLID设置为SYSINSTL,则在重新评估函数定义时,该函数将被识别为系统定义的函数。
如果引用了特定类型(例如,在函数主体中作为SQL变量的数据类型),则权限集还必须至少包含以下内容之一:
- 独特类型的所有权
- 独特类型的“使用”特权
- SYSADM 权限
- SECADM 权限
- CREATE_SECURE_OBJECT权限
权限设置:
如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。
- 特权集包括系统管理员权限
- 特权集包括SYSCTRL权限
- 该进程的SQL授权ID具有对模式进行ALTERIN操作的权限
ALTER FUNCTION(SQL表)的语法
- 1 AS LOCATOR 只能为 LOB 数据类型或基于 LOB 数据类型的独特类型指定。
- 2 有关该片段的语法图,请参阅内置类型的语法。
- 3 array-type-name 仅支持编译后的 SQL 标量函数。
ALTER FUNCTION(SQL表)描述
- function-designator
标识要更改的函数,该函数必须是 SQL 表函数。 函数设计器通过名称、唯一标识函数的函数签名或具体名称来标识 SQL 函数。 更多信息,请参阅功能代号。
数据类型的数量和数据类型的逻辑连接用于唯一地标识功能。 因此,您不能更改参数的数量或参数的数据类型。
函数不得混淆。
- RESTRICT
- 表示如果任何依赖包、函数、具体化查询表或视图引用了该函数,则不会更改或替换该函数。例外情况 :当ALTER语句仅指定DETERMINISTIC或NOT DETERMINISTIC时,函数将被更改,所有相关包都将失效。
- NOT DETERMINISTIC 或者 DETERMINISTIC
- 指定每次使用相同的输入自变量调用函数时函数是否返回相同的结果。 Db2 不验证功能程序是否符合非确定性或确定性的规范。
- NOT DETERMINISTIC
指定即使数据库中的引用数据未发生变化,函数每次调用时,即使输入参数相同,函数也可能不会返回相同的结果表。 函数取决于一些可能影响结果的状态值。 表函数不确定性的一个例子是引用特殊寄存器、其他不确定的函数或影响表函数结果表的序列。
当 MATERIALIZE_NODET_SQLTUDF 子系统参数设置为 "是 "时, Db2 将禁止合并定义为 "非确定 "的 SQL 表函数。 更多信息,请参见宏 DSN6SPRM 中的 MATERIALIZE_NODET_SQLTUDF。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- DETERMINISTIC
指定当数据库中的引用数据未发生变化时,每次使用相同的输入参数调用该函数时,该函数始终返回相同的结果表。
Db2 可以合并使用该选项定义的 SQL 表函数。
如果适用,请指定“确定性”,以防止为引用此函数的 SQL 语句选择非最佳访问路径。 更多信息,请参阅合并与实体化的性能对比。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- EXTERNAL ACTION 或者 NO EXTERNAL ACTION
- 指定函数是否包含外部操作。 Db2 不保证功能程序与外部动作或无外部动作的规格一致。
- EXTERNAL ACTION
- 该函数执行一些外部操作(在函数程序范围之外)。 因此,在调用后续函数时,必须调用该函数。 如果函数调用另一个具有外部动作的函数,则必须指定外部动作。
- NO EXTERNAL ACTION
- 该功能不会执行任何外部操作。 在连续调用每个函数时无需调用它。 定义为“无外部操作”的函数可能比定义为“有外部操作”的函数表现更好,因为该函数可能不会在每次连续调用时都被调用。
- READS SQL DATA 或者 CONTAINS SQL
- 指定此例程可以执行或调用的SQL语句和嵌套例程的分类。 数据库管理员负责验证函数发出的SQL语句以及本地调用的所有例程是否符合规范;当调用嵌套的远程例程时,不会进行验证。 有关各语句的分类,请参阅例程的 SQL 语句数据访问分类。
- READS SQL DATA
- 指定函数可以执行带有数据访问指示的语句,如READS SQL DATA或CONTAINS SQL。 该功能无法执行修改数据的SQL语句。
- CONTAINS SQL
- 指定该函数只能执行数据访问指示为CONTAINS SQL的SQL语句。 该函数不能执行读取或修改数据的语句。
- CALLED ON NULL INPUT
- 指定无论输入参数值是否为空,都调用该函数,使该函数负责测试参数值是否为空。 根据函数主体中的逻辑,该函数可能会返回一个空表。
- INHERIT SPECIAL REGISTERS
- 指定在进入函数时继承特殊寄存器的现有值。
- STATIC DISPATCH
- 指定在函数解析时, Db2 根据函数参数的静态(或声明的)类型选择函数。
- CARDINALITY 整数
- 指定函数返回的预计行数。 该数字用于优化目的。 整数值必须在0-2147483647之间。
如果一个函数具有无限基数(函数永远不会返回表尾条件,而总是返回一行),那么需要表尾条件才能正常运行的查询将需要中断。
- SECURED 或者 NOT SECURED
- 指定该功能是否安全。
ALTER FUNCTION(SQL表)的注释
- 包裹失效:
- 根据指定的条款和关键字以及其他因素,此语句可能会使所有依赖于目标对象的程序包失效,有时还会通过级联效应影响其他相关对象。 更多信息,请参阅 “导致套餐失效的变更 ”。
- 从属对象:
- SQL 例程依赖于例程主体中引用的对象。
- 将一个功能从“未加密”改为“已加密”:
- 通常,安全管理员会检查函数访问的数据,确保其安全,并向需要权限的用户授予CREATE_SECURE_OBJECT权限,以便更改用户定义的函数,使其受到保护。 当函数被更改为SECURED后,安全管理员将撤销函数所有者对CREATE_SECURE_OBJECT的权限。
在执行ALTER FUNCTION语句后,该函数被视为安全。 Db2 将SECURED属性视为一个断言,声明安全管理员已为用户定义函数的任何更改建立了审计程序。 Db2 假定对所有后续的ALTER FUNCTION语句或外部包的更改都执行了这样的控制审计程序。
动态报表缓存中引用该函数的包和报表无效。
- 将“安全”功能改为“非安全”功能:
- 当函数从“安全”更改为“不安全”时,动态语句缓存中引用该函数的包和语句将失效。 如果未受保护的函数访问使用行访问控制或列访问控制的表中的数据,则可能会对性能产生负面影响。 为了将性能影响降到最低,要么更改函数以使用SECURED选项,要么停用函数正在访问的表的行访问控制或列访问控制。
- 在安全函数中调用其他用户定义的函数:
- 当在引用使用行访问控制或列访问控制的表的SQL数据更改语句中引用安全的用户定义函数时,如果安全的用户定义函数调用其他用户定义函数,则嵌套的用户定义函数将不被验证为安全。 如果这些嵌套函数可以访问敏感数据,安全管理员需要确保这些函数被允许访问敏感数据,并确保已针对这些函数的任何更改建立了变更控制审核程序。
- DSN_FUNCTION_TABLE EXPLAIN表中的SECURE列:
- DSN_FUNCTION_TABLE EXPLAIN表中的SECURE列指示用户定义的函数是否安全。
更改混淆函数:
被混淆的功能不能以任何方式更改。
- 兼容性:
- 为了与CREATE FUNCTION(SQL表)语句兼容,可以指定以下子句,但会被忽略:
- LANGUAGE SQL
- 其他语法和同义词:
- 为了与 Db2 或 Db2 系列中其他产品的早期版本兼容, Db2 支持以下关键词:
- VARIANT作为“非确定性”的同义词
- NOT VARIANT 并非“确定性”的同义词
- NULL CALL作为CALLED ON NULL INPUT的同义词
ALTER FUNCTION(SQL表)示例
示例1: 以下语句修改了SQL表函数的定义,将估计基数设置为10000。
ALTER FUNCTION GET_TABLE
RESTRICT CARDINALITY 10000;