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权限

权限设置:

如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。

如果语句是动态准备的,则权限集是指由进程的SQL授权ID所持有的权限集。 指定的例程名称可以包含模式名称(限定符)。 但是,如果架构名称与这些 SQL 授权 ID 中的任何一个都不相同,则必须满足以下条件之一:
  1. 特权集包括系统管理员权限
  2. 特权集包括SYSCTRL权限
  3. 该进程的SQL授权ID具有对模式进行ALTERIN操作的权限

ALTER FUNCTION(SQL表)的语法

阅读语法图跳过可视化语法图ALTERfunction-designatorRESTRICToption-list
功能代号:
阅读语法图跳过可视化语法图FUNCTION功能名称(,参数类型)SPECIFIC FUNCTION专有名词
参数类型:
阅读语法图跳过可视化语法图数据类型AS LOCATOR1
数据类型:
阅读语法图跳过可视化语法图built-in-type2独特类型名称数组类型名称3
注意:
  • 1 AS LOCATOR 只能为 LOB 数据类型或基于 LOB 数据类型的独特类型指定。
  • 2 有关该片段的语法图,请参阅内置类型的语法。
  • 3 array-type-name 仅支持编译后的 SQL 标量函数。

选项列表:

阅读语法图跳过可视化语法图1NOT DETERMINISTICDETERMINISTICEXTERNAL ACTIONNO EXTERNAL ACTIONREADS SQL DATACONTAINS SQLCALLED ON NULL INPUTINHERIT SPECIAL REGISTERSSTATIC DISPATCHCARDINALITY整数SECUREDNOT SECURED
注意:
  • 1 选项列表中的选项可以任意顺序排列。 但是,同一条款不能重复使用。

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
指定该功能是否安全。
SECURED
指定该功能被视为安全。

更改开始使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改更改结束

NOT 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
其他语法和同义词:
为了与 Db2Db2 系列中其他产品的早期版本兼容, Db2 支持以下关键词:
  • VARIANT作为“非确定性”的同义词
  • NOT VARIANT 并非“确定性”的同义词
  • NULL CALL作为CALLED ON NULL INPUT的同义词

ALTER FUNCTION(SQL表)示例

示例1: 以下语句修改了SQL表函数的定义,将估计基数设置为10000。

ALTER FUNCTION GET_TABLE
	RESTRICT CARDINALITY 10000;