=============== ALTER PROCEDURE =============== .. container:: refentry :name: SQL-ALTERPROCEDURE .. container:: titlepage .. container:: refnamediv .. rubric:: ALTER PROCEDURE :name: alter-procedure ALTER PROCEDURE — change the definition of a procedure .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis 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 .. container:: refsect1 :name: id-1.9.3.24.5 .. rubric:: 简介 :name: 简介 ``ALTER PROCEDURE``\ 更改一个过程的定义。 要使用\ ``ALTER PROCEDURE``\ ,你必须拥有该过程。要更改一个过程的方案,你还必须有新方案上的\ ``CREATE``\ 权限。要更改拥有者,你还必须是新拥有角色的直接或间接成员,并且那个角色在该过程的方案上拥有\ ``CREATE``\ 权限(这些限制强制更新拥有者无法做到通过删除和重建该过程无法做到的事情。不过,超级用户总是能够更改任何过程的拥有关系)。 .. container:: refsect1 :name: id-1.9.3.24.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist ``name`` 一个现有的过程的名字(可以被方案限定)。如果没有指定参数列表,这个名字必须在其方案中唯一。 ``argmode`` 参数的模式:\ ``IN``\ 或\ ``VARIADIC``\ 。如果被省略,默认是\ ``IN``\ 。 ``argname`` 参数的名字。注意\ ``ALTER PROCEDURE``\ 实际上并不关心参数名,因为只需要参数的数据类型来确定过程的身份。 ``argtype`` 如果该过程有参数,这是参数的数据类型(可以被方案限定)。 ``new_name`` 该过程的新名字。 ``new_owner`` 该过程的新拥有者。注意,如果这个过程被标记为\ ``SECURITY DEFINER``\ ,接下来它将被作为新拥有者执行。 ``new_schema`` 该过程的新方案。 ``extension_name`` 该过程所依赖的扩展的名称。 ``[ EXTERNAL ] SECURITY INVOKER`` \ ``[ EXTERNAL ] SECURITY DEFINER`` 更改该过程是否为一个安全性定义器。关键词\ ``EXTERNAL``\ 由于SQL符合性的原因被忽略。更多有关这个能力的信息请见\ `CREATE PROCEDURE `__\ 。 ``configuration_parameter`` \ ``value`` 增加或者更改在调用该过程时,要对一个配置参数做的赋值。如果\ ``value``\ 是\ ``DEFAULT``\ 或者等效的值,则会使用\ ``RESET``\ ,过程本地的设置会被移除,这样该过程的执行就会使用其所处环境中的值。使用\ ``RESET ALL``\ 可以清除所有的过程本地设置。\ ``SET FROM CURRENT``\ 会把\ ``ALTER PROCEDURE``\ 执行时该参数的当前值保存为进入该过程时要被应用的值。 ``RESTRICT`` 为了符合SQL标准会被忽略。 .. container:: refsect1 :name: id-1.9.3.24.7 .. rubric:: 示例 :name: 示例 要重命名具有两个\ ``integer``\ 类型参数的过程\ ``insert_data``\ 为\ ``insert_record``\ : .. code:: programlisting ALTER PROCEDURE insert_data(integer, integer) RENAME TO insert_record; 要把具有两个\ ``integer``\ 类型参数的过程\ ``insert_data``\ 的拥有者改为\ ``joe``\ : .. code:: programlisting ALTER PROCEDURE insert_data(integer, integer) OWNER TO joe; 要重把具有两个\ ``integer``\ 类型参数的过程\ ``insert_data``\ 的方案改为\ ``accounting``\ : .. code:: programlisting ALTER PROCEDURE insert_data(integer, integer) SET SCHEMA accounting; 把过程\ ``insert_data(integer, integer)``\ 标记为依赖于扩展\ ``myext``\ : .. code:: programlisting ALTER PROCEDURE insert_data(integer, integer) DEPENDS ON EXTENSION myext; 要调整一个过程自动设置的搜索路径: .. code:: programlisting ALTER PROCEDURE check_password(text) SET search_path = admin, pg_temp; 要为一个过程禁用\ ``search_path``\ 的自动设置: .. code:: programlisting ALTER PROCEDURE check_password(text) RESET search_path; 现在这个过程将用其调用者所使用的任何搜索路径执行。 .. container:: refsect1 :name: id-1.9.3.24.8 .. rubric:: 兼容性 :name: 兼容性 这个语句与SQL标准中的\ ``ALTER PROCEDURE``\ 语句部分兼容。标注你允许修改一个过程的更多性质,但是不提供重命名过程、让过程成为安全性定义器、为过程附加配置参数值或者更改过程的拥有者、方案或者可变性的能力。标准还要求\ ``RESTRICT``\ 关键字,而它在OushuDB中是可选的。 .. container:: refsect1 :name: id-1.9.3.24.9 .. rubric:: 另见 :name: 另见 `CREATE PROCEDURE `__, `DROP PROCEDURE `__, `ALTER FUNCTION `__, `ALTER ROUTINE `__