ALTER EXTENSION
功能描述
修改插件扩展。
注意事项
ALTER EXTENSION 修改一个已安装的扩展的定义。这里有几种方式:
UPDATE
更新扩展到一个新的版本。这个扩展必须满足一个适用的更新脚本(或者一系列脚本)这样就能修改当前安装版本到一个要求的版本。
SET SCHEMA
移动扩展对象到另一个模式。这个扩展必须relocatable才能使命令成功。
relocatable(boolean):扩展的可再定位性,如果支持扩展能被重定位到另一个模式则为true,默认为false。三种支持的可定位性级别如下:
- 一个完全可重定位的扩展能在任何时候被移动到另一个模式中,即使在它被载入到一个数据库中之后。这种移动通过
ALTER EXTENSION SET SCHEMA
命令完成,该命令会自动地把所有成员对象重命名到新的模式中,它的控制文件中需要设置relocatable = true。 - 一个扩展可能在安装过程中是可重定位的,但是安装完后就不再可重定位。典型的情况是扩展的脚本文件需要显式地引用目标模式,例如为 SQL 函数设置search_path属性。对于这样一种扩展,在其控制文件中设置
relocatable = false
,并且使用@extschema@在脚本文件中引用目标模式。在脚本被执行前,所有这个字符串的出现都将被替换为实际的目标模式名。用户可以使用CREATE EXTENSION的SCHEMA选项设置目标模式名。 - 如果扩展根本就不支持重定位,在它的控制文件中设置
relocatable = false
,并且还设置schema为想要的目标模式的名称。这将阻止使用CREATE EXTENSION的SCHEMA选项修改目标模式,除非它指定的是和控制文件中相同的模式。如果该扩展包括关于模式名的内部假设且模式名不能使用@extschema@的方法替换,这种选择通常是必须的。@extschema@替换机制在这种情况中也是可用的,不过由于模式名已经被控制文件所决定,它的使用受到了很大的限制。
ADD member_object
添加一个已存在对象到扩展。这主要在扩展更新脚本上有用。 这个对象接着会被视为扩展的成员;显而易见,该对象只能通过取消扩展来取消 。
DROP member_object
从扩展上移除一个成员对象。 主要在扩展更新脚本上有用。这个对象没有被取消,只是从扩展里分开了。
用户必须拥有扩展来使用 ALTER EXTENSION。 这个 ADD/DROP 方式要求添加/删除对象的所有权。
语法格式
ALTER EXTENSION name UPDATE [ TO new_version ]; ALTER EXTENSION name SET SCHEMA new_schema; ALTER EXTENSION name ADD member_object; ALTER EXTENSION name DROP member_object; where member_object is: FOREIGN TABLE object_name | FUNCTION function_name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) | [ PROCEDURAL ] LANGUAGE object_name | SCHEMA object_name | SERVER object_name | TABLE object_name | TEXT SEARCH CONFIGURATION object_name | TYPE object_name | VIEW object_name
参数说明
name
已安装扩展的名称。
new_version
扩展的新版本。可以通过被标识符和字面字符重写。如果不指定的扩展的新版本,ALTER EXTENSION UPDATE会更新到扩展的控制文件中显示的默认版本。
new_schema
扩展的新模式。
object_name
从扩展里被添加或移除的对象的名称。包含表、聚合 、域、外链表、操作符、操作符类、操作符族、序列、文本搜索对象、类型和能被模式合格的视图的名称。
function_name
函数名称。
argmode
这个函数参数的模型:IN、OUT、INOUT或者VARIADIC。如果省略的话,默认值为IN。ALTER EXTENSION 不关心OUT参数 ,因为确认函数的一致性只需要输入参数,因此列出IN、INOUT和VARIADIC参数就足够了。
argname
函数参数的名称。ALTER EXTENSION不关心参数名称,确认函数的一致性只需要参数数据类型。
argtype
函数参数的数据类型(可以有模式修饰)。
示例
1、创建扩展。
create extension "uuid-ossp";
2、更新 “uuid-ossp” 扩展到版本 2.0。
ALTER EXTENSION "uuid-ossp" UPDATE TO '2.0';
3、创建模式utils。
CREATE SCHEMA utils;
4、更新 “uuid-ossp”扩展的模式为utils。
ALTER EXTENSION "uuid-ossp" SET SCHEMA utils;
5、创建函数。
create function length(p_one text, p_other text) returns text as $$ select case when length(p_one) >= length(p_other) then p_one else p_other end $$ language sql immutable;
6、添加length函数给 “uuid-ossp” 扩展。
ALTER EXTENSION "uuid-ossp" ADD FUNCTION length(p_one text, p_other text);
7、从”uuid-ossp” 扩展扩展删除length函数。
ALTER EXTENSION "uuid-ossp" DROP FUNCTION length(p_one text, p_other text);
- 一个完全可重定位的扩展能在任何时候被移动到另一个模式中,即使在它被载入到一个数据库中之后。这种移动通过