============== ALTER FUNCTION ============== .. container:: refentry :name: SQL-ALTERFUNCTION .. container:: titlepage .. container:: refnamediv .. rubric:: ALTER FUNCTION :name: alter-function ALTER FUNCTION — 更改一个函数的定义 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: 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 | CURRENT_USER | SESSION_USER } ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] SET SCHEMA new_schema ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] DEPENDS ON EXTENSION extension_name 其中 action 是以下之一: CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER PARALLEL { UNSAFE | RESTRICTED | SAFE } COST execution_cost ROWS result_rows SUPPORT support_function SET configuration_parameter { TO | = } { value | DEFAULT } SET configuration_parameter FROM CURRENT RESET configuration_parameter RESET ALL .. container:: refsect1 :name: id-1.9.3.14.5 .. rubric:: 描述 :name: 描述 ``ALTER FUNCTION``\ 更改一个函数的定义。 你必须拥有该函数以使用\ ``ALTER FUNCTION``\ 。要更改一个函数 的模式,你还必须具有新模式上的\ ``CREATE``\ 特权。要 更改拥有者,你还必须是新拥有角色的一个直接或者间接成员,并且该角色必须 具有在该函数的模式上的\ ``CREATE``\ 特权(这些限制强制修改拥有 者不能做一些通过删除和重建该函数做不到的事情。不过,一个超级用户怎么都能 更改任何函数的所有权)。 .. container:: refsect1 :name: id-1.9.3.14.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``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``* 该函数的新模式。 *``extension_name``* 该函数所以来的扩展名。 ``CALLED ON NULL INPUT`` \ ``RETURNS NULL ON NULL INPUT`` \ ``STRICT`` ``CALLED ON NULL INPUT``\ 将该函数改为在某些 或者全部参数为空值时可以被调用。 ``RETURNS NULL ON NULL INPUT``\ 或者 ``STRICT``\ 将该函数改为只要任一参数为空值就不被调用而 是自动假定一个空值结果。详见\ `CREATE FUNCTION `__\ 。 ``IMMUTABLE`` \ ``STABLE`` \ ``VOLATILE`` 把该函数的稳定性更改为指定的设置。详见 `CREATE FUNCTION `__\ 。 ``[ EXTERNAL ] SECURITY INVOKER`` \ ``[ EXTERNAL ] SECURITY DEFINER`` 更改该函数是否为一个安全性定义者。关键词\ ``EXTERNAL`` 是为了符合 SQL,它会被忽略。关于这项能力的详情请见 `CREATE FUNCTION `__\ 。 ``PARALLEL`` 决定该函数对于并行是否安全。详见 `CREATE FUNCTION `__\ 。 ``LEAKPROOF`` 更改该函数是否被认为是防泄漏的。关于这项能力的详情请见 `CREATE FUNCTION `__\ 。 ``COST`` *``execution_cost``* 更改该函数的估计执行代价。详见\ `CREATE FUNCTION `__\ 。 ``ROWS`` *``result_rows``* 更改一个集合返回函数的估计行数。详见 `CREATE FUNCTION `__\ 。 ``SUPPORT`` *``support_function``* 设置或更改计划器支持函数以使用这个函数。 此选项不能用于完全删除支持功能,因为它必须命名新的支持函数。 如果需要这样做,可以使用\ ``CREATE OR REPLACE FUNCTION``\ 。 *``configuration_parameter``* \ *``value``* 当该函数被调用时,要对一个配置参数做出增加或者更改的赋值。如果 *``value``*\ 是\ ``DEFAULT`` 或者使用等价的\ ``RESET``\ ,该函数本地的设置将会被 移除,这样该函数会使用其环境中存在的值执行。使用\ ``RESET ALL``\ 可以清除所有函数本地的设置。 ``SET FROM CURRENT``\ 把\ ``ALTER FUNCTION`` 执行时该参数的当前值保存为进入 该函数时要应用的值。 ``RESTRICT`` 为了符合 SQL 标准存在,被忽略。 .. container:: refsect1 :name: id-1.9.3.14.7 .. rubric:: 示例 :name: 示例 要把用于类型\ ``integer``\ 的函数\ ``sqrt`` 重命名为\ ``square_root``\ : .. code:: programlisting ALTER FUNCTION sqrt(integer) RENAME TO square_root; 要把用于类型\ ``integer``\ 的函数\ ``sqrt`` 的拥有者改为\ ``joe``\ : .. code:: programlisting ALTER FUNCTION sqrt(integer) OWNER TO joe; 要把用于类型\ ``integer``\ 的函数\ ``sqrt`` 的模式改为\ ``maths``\ : .. code:: programlisting ALTER FUNCTION sqrt(integer) SET SCHEMA maths; 要把类型\ ``integer``\ 的函数\ ``sqrt`` 标记为依赖于扩展\ ``mathlib``\ : .. code:: programlisting ALTER FUNCTION sqrt(integer) DEPENDS ON EXTENSION mathlib; 要调整一个函数的自动搜索路径: .. code:: programlisting ALTER FUNCTION check_password(text) SET search_path = admin, pg_temp; 要禁止一个函数的\ ``search_path``\ 的自动设置: .. code:: programlisting ALTER FUNCTION check_password(text) RESET search_path; 这个函数将用其调用者使用的搜索路径来执行。 .. container:: refsect1 :name: id-1.9.3.14.8 .. rubric:: 兼容性 :name: 兼容性 这个语句部分兼容 SQL 标准中的\ ``ALTER FUNCTION``\ 语句。该标准允许修改一个函数的更多属性,但是不提供 重命名一个函数、标记一个函数为安全性定义者、为一个函数附加配置参 数值或者更改一个函数的拥有者、模式或者稳定性等功能。该标准还要求 ``RESTRICT``\ 关键字,它在PostgreSQL 中是可选的。 .. container:: refsect1 :name: id-1.9.3.14.9 .. rubric:: 另见 :name: 另见 `CREATE FUNCTION `__, `DROP FUNCTION `__, `ALTER PROCEDURE `__, `ALTER ROUTINE `__