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

这里的 action 是下列之一:

    CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    IMMUTABLE | STABLE | VOLATILE
    [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER

描述

ALTER FUNCTION 修改一个函数的定义。

要使用 ALTER FUNCTION,你必须拥有该函数。 要修改一个域的模式,你还必须在新模式上拥有 CREATE 权限。 要修改所有者,你必须还是新的所有角色的直接或者间接的成员, 并且该成员必须在此域的模式上有 CREATE 权限。 (这些限制保证了修改所有者和删除、重建域的动作没啥区别。 不过,超级用户可以用任何方法修改域的所有者。)

参数

name

一个现有的函数的名字(可以有模式修饰)。

argmode

一个参数的模式:可以是 INOUT、或者 INOUT。 如果省略,缺省是 IN。请主意 ALTER FUNCTION 实际不会注意任何 OUT 参数,因为判断函数的身份只需要输入参数。 因此列出 ININOUT 参数就足够了。

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 把函数改成在所有参数都是空的时候也会调用它。 RETURNS NULL ON NULL INPUT 或者 STRICT 把函数改成如果任何一个参数是空,就根本不执行,而是自动假设返回值为空。 参阅 CREATE FUNCTION 获取更多信息。

IMMUTABLE
STABLE
VOLATILE

把函数的易失属性修改为指定类型。 参阅 CREATE FUNCTION 细节。

[ EXTERNAL ] SECURITY INVOKER
[ EXTERNAL ] SECURITY DEFINER

修改函数的安全性定义,标识它是否安全定义的。 出于兼容 SQL 标准,关键字 EXTERNAL 被忽略。 参阅 CREATE FUNCTION 获取更多有关这个功能的信息。

RESTRICT

因兼容 SQL 标准而忽略。

例子

把名字为 sqrt,参数类型为 integer 的函数重命名为 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;

兼容性

这个语句部分兼容 SQL 标准里面的 ALTER FUNCTION 语句。 标准允许修改函数的更多的属性,但是没有提供修改函数名字的功能, 也没有提供把一个函数定义为安全定义器的功能,更没有修改函数所有者、模式和易失性的功能。 标准还要求 RESTRICT 关键字;这在 PostgreSQL 里是可选的。

又见

CREATE FUNCTION, DROP FUNCTION