
# ALTER FUNCTION
#### 功能描述
修改自定义函数的属性。
#### 注意事项
- 只有该函数的所有者或者授予了函数ALTER权限的用户才有权限执行ALTER FUNCTION，系统管理员默认拥有该权限。
- 要修改函数的所有者的用户必须是新拥有角色的直接或间接成员。
- 要修改函数的所有者，新所有者必须拥有该函数所属模式的CREATE权限。
- 要修改函数的所属模式，必须拥有新模式的CREATE权限。
- 如果函数中涉及对临时表相关的操作，则无法使用ALTER FUNCTION。
 
#### 语法格式
- 修改自定义函数的附加参数。
  ```
  ALTER FUNCTION function_name ( [ { [ argmode ] [ argname ] argtype} [, ...] ] )
      action [ ... ] [ RESTRICT ];
  ```
  其中附加参数action子句语法为：
  ```
  {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT}
   | {IMMUTABLE | STABLE | VOLATILE}
   | {SHIPPABLE | NOT SHIPPABLE}
   | {NOT FENCED | FENCED}
   | {MASKED | NOT MASKED}
   | [ 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}
  ```
  
- 修改自定义函数的名称，支持新函数名前带有原函数所在的schema名，不支持同时修改schema名。
  ```
  ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] )
      RENAME TO new_name;
  ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] )
      RENAME TO schema.new_name;
  ```
  
- 修改自定义函数的所属者。
  ```
  ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] )
      OWNER TO new_owner;
  ```
  
- 修改自定义函数的模式。
  ```
  ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] )
      SET SCHEMA new_schema;
  ```
  
 
#### 参数说明
表1ALTER FUNCTION参数说明 
| 参数                                                           | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 取值范围                                                                                                                                                                      |
|:---|:---|:---|
| function_name                                                | 需要修改的函数名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 已存在的函数名。                                                                                                                                                                  |
| argmode                                                      | 参数的模式。标识该参数是输入、输出还是输入输出参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | IN、OUT或者IN OUT。 缺省值是IN。                                                                                                    |
| argname                                                      | 参数名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                   |
| argtype                                                      | 函数的参数类型。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 有效的类型，请参考[数据类型](https://support.huaweicloud.com/sqlreference-dws/dws_06_0008.html)。                                                                                       |
| new_name                                                     | 函数的新名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                   |
| new_owner                                                    | 函数的新所有者。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 有效的用户名或角色名。                                                                                                                                                               |
| new_schema                                                   | 函数的新模式。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 已存在的模式。                                                                                                                                                                   |
| CALLED ON NULL INPUT \| RETURNS NULL ON NULL INPUT \| STRICT | - CALLED ON NULL INPUT，表明该函数的某些参数是NULL时可以按照正常的方式调用。缺省时与指定此参数的作用相同。  - STRICT，如果函数的某个参数是NULL时，此函数总是返回NULL。如果指定了该参数，当参数为NULL值时不被调用而只是自动返回一个NULL结果。  - RETURNS NULL ON NULL INPUT和STRICT的功能相同。                                                                                                                                                                                                                                                                                                                                                                                                                                                          | -                                                                                                                                                                         |
| IMMUTABLE \| STABLE \| VOLATILE                              | - IMMUTABLE，表示该函数在给出同样的参数值时总是返回同样的结果。  - STABLE，表示该函数不能修改数据库，对相同参数值，在同一次表扫描里，该函数的返回值不变，但是返回值可能在不同SQL语句之间变化。  - VOLATILE，表示该函数值可以在一次表扫描内改变，不会做任何优化。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | IMMUTABLE、STABLE和VOLATILE的详细介绍可参考[DWS函数易变属性的三种行为](https://support.huaweicloud.com/sqlreference-dws/dws_06_0163.html#ZH-CN_TOPIC_0000001811634697__section16930141417511)。 |
| SHIPPABLE \| NOT SHIPPABLE                                   | 表示该函数是否可以下推到DN上执行。 - 对于IMMUTABLE类型的函数，函数始终可以下推到DN上执行。  - 对于STABLE/VOLATILE类型的函数，仅当函数的属性是SHIPPABLE的时候，函数可以下推到DN执行。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | -                                                                                                                                                                         |
| MASKED \| NOT MASKED                                         | 表示该函数在guc参数enable_redactcol_computable开启的情况下，是否进行脱敏。系统函数支持修改MASKED、NOT MASKED选项，不支持和ALTER FUNCTION中的其他action选项一起修改。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | -                                                                                                                                                                         |
| LEAKPROOF                                                    | 表示该函数没有副作用，指出参数只包括返回值。LEAKPROOF只能由系统管理员设置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | -                                                                                                                                                                         |
| EXTERNAL（可选）                                                 | 允许使用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或RESET，表示新的会话中使用系统的缺省设置。  - OFF，表示关闭设置。   指定默认值。   - from current 取当前会话中的值设置为configuration_parameter的值。    | 字符串。                                                                                                                                                                      |
   
#### 示例
创建计算两个整数和的函数func_add_sql2并返回结果。如果输入为null，则返回null。
```
DROP FUNCTION IF EXISTS func_add_sql2; 
CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integer
AS
BEGIN 
RETURN num1 + num2;
END;
/
;
```
修改函数func_add_sql2的执行规则为IMMUTABLE，即参数不变时返回相同结果。
```
ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) IMMUTABLE;
```
将函数func_add_sql2的名称修改为add_two_number。
```
ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) RENAME TO add_two_number;
```
将函数add_two_number的所有者修改为dbadmin。
```
ALTER FUNCTION add_two_number(INTEGER, INTEGER) OWNER TO dbadmin;
```
#### 相关链接
[CREATE FUNCTION](https://support.huaweicloud.com/sqlreference-dws/dws_06_0163.html)，[DROP FUNCTION](https://support.huaweicloud.com/sqlreference-dws/dws_06_0193.html)
