多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# ALTER FUNCTION ## Name ALTER FUNCTION -- 修改一个函数的定义 ## Synopsis ``` ALTER FUNCTION _name_ ( [ [ _argmode_ ] [ _argname_ ] _argtype_ [, ...] ] ) _action_ [ ... ] [ RESTRICT ] ALTER FUNCTION _name_ ( [ [ _argmode_ ] [ _argname_ ] _argtype_ [, ...] ] ) RENAME TO _new_name_ ALTER FUNCTION _name_ ( [ [ _argmode_ ] [ _argname_ ] _argtype_ [, ...] ] ) OWNER TO _new_owner_ ALTER FUNCTION _name_ ( [ [ _argmode_ ] [ _argname_ ] _argtype_ [, ...] ] ) SET SCHEMA _new_schema_ where `_action_` is one of: CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER COST _execution_cost_ ROWS _result_rows_ SET _configuration_parameter_ { TO | = } { _value_ | DEFAULT } SET _configuration_parameter_ FROM CURRENT RESET _configuration_parameter_ RESET ALL ``` ## 描述 `ALTER FUNCTION` 修改一个函数的定义。 要使用`ALTER FUNCTION` ,你必须是该函数的所有者。 要修改一个函数的模式,你还必须在新模式上拥有 `CREATE` 权限。 要修改所有者,你必须还是新的所有角色的直接或者间接的成员,并且该成员必须在此函数的模式上有 `CREATE` 权限。 (这些限制保证了修改所有者和删除、重建函数的动作没啥区别。 不过,超级用户可以用任何方法修改函数的所有关系。) ## 参数 `_name_` 一个现有的函数名字(可以有模式修饰) 。 `_argmode_` 参数的模式:`IN`、`OUT`、`INOUT`或是`VARIADIC`。 如省略的话,缺省是`IN`。 注意`ALTER FUNCTION` 实际不会关注任何`OUT` 参数, 因为确认函数的逻辑只需要知道输入参数。 因此列出`IN`、`INOUT`和`VARIADIC`参数就足够了。 `_argname_` 参数的名字。 请注意`ALTER FUNCTION`实际上不会关注参数的名字,因为只有参数的数据类型用于确认函数的逻辑。 `_argtype_` 如果有的话,是该函数参数的数据类型(可以用模式修饰)。 `_new_name_` 函数的新名字。 `_new_owner_` 函数的新所有者。请注意如果函数标记为`SECURITY DEFINER`,那么它随后将以新的所有者执行。 `_new_schema_` 函数的新模式名称。 `CALLED ON NULL INPUT``RETURNS NULL ON NULL INPUT` `STRICT` `CALLED ON NULL INPUT` 选项会在函数的部分或是全部的参数是NULL的时候会调用它。 `RETURNS NULL ON NULL INPUT`或`STRICT` 把函数改成如果任何一个参数是NULL就根本不执行并且自动返回NULL 。 参阅[CREATE FUNCTION](#calibre_link-4)获取更多信息。 `IMMUTABLE` `STABLE` `VOLATILE` 把函数的易失属性修改为指定类型。参阅[CREATE FUNCTION](#calibre_link-4)了解更多细节。 `[ EXTERNAL ] SECURITY INVOKER` `[ EXTERNAL ] SECURITY DEFINER` `SECURITY INVOKER`表明该函数将带着调用它的用户的权限执行。 `SECURITY DEFINER` 声明该函数将以创建它的用户的权限执行。 关键字 `EXTERNAL` 不是必需的,仅是为了和 SQL 兼容。参阅 [CREATE FUNCTION](#calibre_link-4) 了解更多细节。 `LEAKPROOF` 更改函数的密封性。 参阅 [CREATE FUNCTION](#calibre_link-4) 了解更多细节。 `COST` `_execution_cost_` 更改函数的估计执行成本。 参阅[CREATE FUNCTION](#calibre_link-4)了解更多细节。 `ROWS` `_result_rows_` 更改返回数据集类型函数的返回估计行数。参阅[CREATE FUNCTION](#calibre_link-4)了解更多细节。 `_configuration_parameter_` `_value_` 当函数被调用时,添加或者更改对配置参数值的配置。如果 `_value_`是`DEFAULT`, 或者相应地`RESET`选项被使用,函数的局部设置参数会被清除,这样函数会使用当前环境中的参数值来执行。 使用`RESET ALL`来清理所有的函数局部设置参数。 `SET FROM CURRENT`保存会话的参数当前值为函数调用时会应用的参数值。 参阅[SET](#calibre_link-675)和[Chapter 18](#calibre_link-500) 了解更多关于允许的参数名称和数值的信息。 `RESTRICT` 可忽略的选项,仅为了符合SQL标准。 ## 例子 把参数类型为`integer`的函数`sqrt`重命名为`square_root` : ``` ALTER FUNCTION sqrt(integer) RENAME TO square_root; ``` 把参数类型为`integer`的函数`sqrt`的所有者修改为`joe` : ``` ALTER FUNCTION sqrt(integer) OWNER TO joe; ``` 把参数类型为`integer`的函数`sqrt`的模式修改为`maths`: ``` ALTER FUNCTION sqrt(integer) SET SCHEMA maths; ``` 调整自动为函数设定的搜索路径: ``` ALTER FUNCTION check_password(text) SET search_path = admin, pg_temp; ``` 禁用针对一个函数的`search_path`自动设置: ``` ALTER FUNCTION check_password(text) RESET search_path; ``` 这个函数在执行时所用的搜索路径将是根据调用者所用的搜索路径。 ## 兼容性 这个语句部分兼容SQL标准里面的`ALTER FUNCTION`语句。 标准允许修改函数的更多属性,但是没有提供修改函数名字的功能, 也没有提供把一个函数定义为安全定义器的功能, 更没有修改函数所有者、模式、易失性的功能。 标准还要求`RESTRICT`关键字,这在PostgreSQL里是可选的。 ## 参见 [CREATE FUNCTION](#calibre_link-4), [DROP FUNCTION](#calibre_link-587)