ALTER PROCEDURE

ALTER PROCEDURE更改一个过程的定义。

简介

要使用ALTER PROCEDURE,你必须拥有该过程。要更改一个过程的方案,你还必须有新方案上的CREATE特权。要更改拥有者,你还必须是新拥有角色的直接或间接成员,并且那个角色在该过程的方案上拥有CREATE特权(这些限制强制更新拥有者无法做到通过删除和重建该过程无法做到的事情。不过,超级用户总是能够更改任何过程的拥有关系)。

语法

    ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
        action [ ... ] [ RESTRICT ]
    ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
        RENAME TO new_name
    ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
        OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
    ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
        SET SCHEMA new_schema
    ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
        DEPENDS ON EXTENSION extension_name

    其中action是下列之一:

        [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
        SET configuration_parameter { TO | = } { value | DEFAULT }
        SET configuration_parameter FROM CURRENT
        RESET configuration_parameter
        RESET ALL

参数

name一个现有的过程的名字(可以被方案限定)。如果没有指定参数列表,这个名字必须在其方案中唯一。

argmode参数的模式:INVARIADIC。如果被省略,默认是IN

argname参数的名字。注意ALTER PROCEDURE实际上并不关心参数名,因为只需要参数的数据类型来确定过程的身份。

argtype如果该过程有参数,这是参数的数据类型(可以被方案限定)。

new_name该过程的新名字。

new_owner该过程的新拥有者。注意,如果这个过程被标记为SECURITY DEFINER,接下来它将被作为新拥有者执行。

new_schema该过程的新方案。

extension_name该过程所依赖的扩展的名称。

[EXTERNAL] SECURITY INVOKER[EXTERNAL] SECURITY DEFINER更改该过程是否为一个安全性定义器。关键词EXTERNAL由于 SQL 符合性的原因被忽略。

configuration_parameter value增加或者更改在调用该过程时,要对一个配置参数做的赋值。如果 valueDEFAULT或者等效的值,则会使用RESET,过程本地的设置会被移除,这样该过程的执行就会使用其所处环境中的值。使用RESET ALL可以清除所有的过程本地设置。SET FROM CURRENT会把ALTER PROCEDURE执行时该参数的当前值保存为进入该过程时要被应用的值。

RESTRICT为了符合 SQL 标准会被忽略。

示例

要重命名具有两个integer类型参数的过程insert_datainsert_record

    ALTER PROCEDURE insert_data(integer, integer) RENAME TO insert_record;

要把具有两个integer类型参数的过程insert_data的拥有者改为joe

    ALTER PROCEDURE insert_data(integer, integer) OWNER TO joe;

要重把具有两个integer类型参数的过程insert_data的方案改为accounting

    ALTER PROCEDURE insert_data(integer, integer) SET SCHEMA accounting;

把过程insert_data(integer, integer)标记为依赖于扩展myext

    ALTER PROCEDURE insert_data(integer, integer) DEPENDS ON EXTENSION myext;

要调整一个过程自动设置的搜索路径:

    ALTER PROCEDURE check_password(text) SET search_path = admin, pg_temp;

要为一个过程禁用search_path的自动设置:

    ALTER PROCEDURE check_password(text) RESET search_path;

现在这个过程将用其调用者所使用的任何搜索路径执行。