ALTER PROCEDURE
功能描述
修改自定义存储过程的属性或重编译存储过程。
注意事项
- 只有存储过程的所有者或者被授予了存储过程ALTER权限的用户才能执行ALTER PROCEDURE命令,系统管理员默认拥有该权限。针对所要修改属性的不同,还有以下权限约束:
- 如果存储过程中涉及对临时表相关的操作,则无法使用ALTER PROCEDURE。
- 修改存储过程的所有者或修改存储过程的模式,当前用户必须是该存储过程的所有者或者系统管理员,且该用户是新所有者角色的成员。
- 只有系统管理员和初始化用户可以将存储过程的模式修改成public。
- 仅有初始用户或者创建该存储过程的用户可以修改存储过程为定义者权限的存储过程。
- 当打开三权分立时,对于定义者权限的存储过程,不允许任何角色修改存储过程的所有者。
- 当关闭三权分立时,对于定义者权限的存储过程,仅初始用户和系统管理员可以修改存储过程的所有者。
- 只有初始用户才能修改存储过程的所有者为初始用户。
语法格式
- 修改自定义存储过程的附加参数
ALTER PROCEDURE procedure_name ( [ { [ argname ] [ argmode ] argtype} [, ...] ] ) action [ ... ] [ RESTRICT ];
其中,附加参数action子句语法为:
{{CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT} | {IMMUTABLE | STABLE | VOLATILE} | {SHIPPABLE | NOT SHIPPABLE} | {NOT FENCED | FENCED} | [ NOT ] LEAKPROOF | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER } | AUTHID { DEFINER | CURRENT_USER } | COST execution_cost | ROWS result_rows | SET configuration_parameter { { TO | = } { value | DEFAULT }| FROM CURRENT} | RESET {configuration_parameter | ALL}}
- 修改自定义存储过程的名称
ALTER PROCEDURE procedure_name( [ { [ argname ] [ argmode ] argtype} [, ...] ] ) RENAME TO new_name;
- 修改自定义存储过程的所有者
ALTER PROCEDURE procedure_name( [ { [ argname ] [ argmode ] argtype} [, ...] ] ) OWNER TO new_owner;
- 修改自定义存储过程的模式
ALTER PROCEDURE procedure_name( [ { [ argname ] [ argmode ] argtype} [, ...] ] ) SET SCHEMA new_schema;
参数说明
- procedure_name
要修改的存储过程名称。
取值范围:已存在的存储过程名。
- argmode
用于标识该参数是输入参数或输出参数。
取值范围:IN、OUT、INOUT或VARIADIC。
- argname
参数名称。
取值范围:字符串,要符合标识符命名规范。
- argtype
存储过程参数的类型。
- CALLED ON NULL INPUT
表明该存储过程的某些参数为NULL时,可以按照正常的方式调用。缺省时与指定此参数的作用相同。
- RETURNS NULL ON NULL INPUT | STRICT
STRICT:用于指定当一个存储过程的某个参数为NULL时,则该存储过程返回NULL。如果声明了该参数,则如果存在NULL参数时不会执行该存储过程,而直接自动返回一个NULL结果。
RETURNS NULL ON NULL INPUT和STRICT的功能相同。
- IMMUTABLE
表示该存储过程在给出同样的参数值时总是返回同样的结果。
- STABLE
表示该存储过程不能修改数据库,对相同参数值,在同一次表扫描里,该存储过程的返回值不变,但是返回值可能在不同SQL语句之间变化。
- VOLATILE
表示该存储过程值可以在一次表扫描内改变,不会做任何优化。
- SHIPPABLE | NOT SHIPPABLE、FENCED | NOT FENCED等
行为约束可选项。各参数的功能与CREATE FUNCTION类似,详细说明请参见CREATE FUNCTION。
- LEAKPROOF
表示该存储过程没有副作用,指出参数只包括返回值。LEAKPROOF只能由系统管理员设置。
- EXTERNAL
(可选)目的是和SQL兼容,这个特性适合于所有函数,而不仅是外部函数。
- SECURITY INVOKER | AUTHID CURRENT_USER
表明该存储过程将以调用者的用户的权限执行。缺省时与指定此参数的作用相同。
SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。
- SECURITY DEFINER | AUTHID DEFINER
声明该存储过程将以创建者的用户的权限执行。
AUTHID DEFINER和SECURITY DEFINER的功能相同。
- COST execution_cost
用于估计存储过程的执行成本。
execution_cost以cpu_operator_cost为单位。
取值范围:正数。
- ROWS result_rows
估计存储过程返回的行数。用于存储过程返回的是一个集合。
取值范围:正数,默认值是1000。
- configuration_parameter
- value
将指定的数据库会话参数值设置为具体值。
取值范围:字符串。
- DEFAULT:在新的会话中使用系统的缺省设置。
- OFF:关闭设置。
- RESET:在新的会话中使用系统的缺省设置。
- 用户指定的值:需要满足修改参数的取值限制。
- DEFAULT
默认值。
- FROM CURRENT
取当前会话中的值设置为configuration_parameter的值。
- value
- ALL
所有运行时参数。
- new_name
存储过程的新名称。要修改存储过程的所属模式,必须拥有新模式的CREATE权限。
取值范围:字符串,要符合标识符命名规范。
- new_owner
存储过程的新所有者。要修改存储过程的所有者,新所有者必须拥有该存储过程所属模式的CREATE权限。
取值范围:已存在的用户角色。
- new_schema
存储过程的新模式。
取值范围:已存在的模式。
- RESTRICT
仅为了符合SQL标准,可被忽略。
示例
--创建存储过程。 gaussdb=# CREATE OR REPLACE PROCEDURE test_proc(a int) IS proc_var int; BEGIN proc_var := a; END; / --修改存储过程的执行规则为IMMUTABLE,即参数不变时返回结果相同。 gaussdb=# ALTER PROCEDURE test_proc(a int) IMMUTABLE; --新建用户。 gaussdb=# CREATE USER joe PASSWORD '********'; --修改存储过程的所有者。 gaussdb=# ALTER PROCEDURE test_proc(a int) OWNER TO joe; --新建模式。 gaussdb=# CREATE SCHEMA test; --修改存储过程的所属模式。 gaussdb=# ALTER PROCEDURE test_proc(a int) SET SCHEMA test; --删除存储过程,函数名需要指定所属模式。 gaussdb=# DROP PROCEDURE test.test_proc; --删除新建的用户和模式。 gaussdb=# DROP USER joe; gaussdb=# DROP SCHEMA test;