CREATE EXTENSION
CREATE EXTENSION — 安装一个扩展
大纲
CREATE EXTENSION [ IF NOT EXISTS ]extension_name[ WITH ] [ SCHEMAschema_name] [ VERSIONversion] [ FROMold_version] [ CASCADE ]
描述
CREATE EXTENSION 将一个新扩展装载到当前数据库中。同名扩展不能已经被装载。
装载一个扩展本质上就是运行该扩展的脚本文件。该脚本通常会创建新的
SQL 对象,例如函数、数据类型、操作符以及索引支持方法。CREATE EXTENSION 还会记录所有已创建对象的标识,这样在发出 DROP EXTENSION 时就可以将它们一并删除。
加载扩展需要与创建其组件对象所需的权限相同。对于大多数扩展,这意味着需要超级用户或数据库所有者权限。运行 CREATE EXTENSION 的用户将成为扩展的所有者,用于后续的权限检查,以及扩展脚本创建的任何对象的所有者。
参数
IF NOT EXISTS如果已存在同名扩展,则不要抛出错误。这种情况下会发出一条提示。注意,这并不保证现有扩展与根据当前可用脚本文件本应创建出的扩展有任何相似之处。
extension_name要安装的扩展名称。PostgreSQL 将根据
SHAREDIR/extension/extension_name.control文件中的详细信息创建该扩展。schema_name如果该扩展允许其内容被重定位,则这是安装该扩展所含对象的模式名称。指定的模式必须已经存在。如果未指定,并且扩展控制文件中也未指定模式,则使用当前默认的对象创建模式。
如果扩展在其控制文件中指定了
schema参数,就不能用SCHEMA子句覆盖该模式。通常,如果给出了SCHEMA子句,且它与扩展的schema参数冲突,就会报错。不过,如果同时给出CASCADE子句,则发生冲突时会忽略schema_name。给定的schema_name将用于安装任何必需且其控制文件中未指定schema的扩展。请记住,扩展本身不被视为属于任何模式:扩展的名称是非限定名,并且必须在整个数据库范围内唯一。但是,属于该扩展的对象可以位于模式中。
version要安装的扩展版本。它可以写成标识符,也可以写成字符串常量。默认版本由扩展控制文件指定。
old_versionFROMold_version必须在且仅在尝试安装一个替换“旧式”模块的扩展时指定,该模块仅是一组未打包为扩展的对象集合。此选项会导致CREATE EXTENSION运行一个替代安装脚本,将现有对象吸收进扩展中,而不是创建新对象。请确保SCHEMA指定的是包含这些现有对象的模式。old_version的值由扩展作者决定,如果存在多个可升级为扩展的旧式模块版本,该值可能会有所不同。对于 PostgreSQL 9.1 之前版本提供的标准附加模块,将模块更新为扩展形式时应使用unpackaged作为old_version的值。CASCADE自动安装该扩展所依赖、但尚未安装的任何扩展。它们的依赖也会以同样的方式递归自动安装。如果给出了
SCHEMA子句,它将适用于所有以这种方式安装的扩展。该语句的其他选项不会应用于自动安装的扩展;特别是,这些扩展总是选择其默认版本。
注解
在使用 CREATE EXTENSION 将扩展装载到数据库之前,必须先安装好该扩展的支持文件。关于安装
PostgreSQL 随附扩展的信息,可见额外提供的模块。
当前可供装载的扩展可从系统视图
pg_available_extensions
或
pg_available_extension_versions
中查出。
小心
以超级用户身份安装扩展,意味着必须相信扩展作者以安全的方式编写了扩展安装脚本。恶意用户要创建特洛伊木马对象并不算太难;这类对象可能会在之后执行编写粗心的扩展脚本时实施攻击,使该用户获得超级用户权限。不过,只有当特洛伊木马对象在脚本执行期间位于
search_path 中时,它们才会构成危险;这意味着它们位于扩展的安装目标模式中,或位于它所依赖的某个扩展的目标模式中。因此,处理那些脚本尚未经过仔细审查的扩展时,一个经验法则是:只把它们安装到从未向任何不受信任用户授予、而且今后也不会授予
CREATE 权限的模式中。它们所依赖的任何扩展也应如此。
一般认为,PostgreSQL 随附的扩展能够抵御这类安装时攻击,但少数依赖其他扩展的扩展除外。正如这些扩展的文档所述,它们应当安装到安全模式中,或者安装到与其所依赖扩展相同的模式中,或者同时满足这两点。
关于编写新扩展的信息,见第 37.15 节。
示例
将 hstore 扩展安装到当前数据库中,并把其对象放在 addons 模式中:
CREATE EXTENSION hstore SCHEMA addons;
实现同样效果的另一种方式是:
SET search_path = addons; CREATE EXTENSION hstore;
将 PostgreSQL 9.1 之前版本中安装的 hstore 更新为扩展形式:
CREATE EXTENSION hstore SCHEMA public FROM unpackaged;
请注意指定安装现有 hstore 对象时所用的模式。
兼容性
CREATE EXTENSION 是
PostgreSQL 的扩展。