# 创建扩展

CREATE EXTENSION — 安装扩展

# 概要

CREATE EXTENSION [ IF NOT EXISTS ] extension_name
    [ WITH ] [ SCHEMA schema_name ]
             [ VERSION version ]
             [ CASCADE ]

# 描述

创建扩展将新扩展加载到当前数据库中。不得已加载同名的扩展名。

加载扩展实质上相当于运行扩展的脚本文件。该脚本通常会创建新的 SQL 对象,例如函数、数据类型、运算符和索引支持方法。创建扩展额外记录所有创建的对象的身份,以便它们可以再次被删除,如果删除扩展发出。

运行的用户创建扩展成为扩展的所有者以便以后进行权限检查,并且通常还成为由扩展脚本创建的任何对象的所有者。

加载扩展通常需要创建其组件对象所需的相同权限。对于许多扩展,这意味着需要超级用户权限。但是,如果扩展名被标记值得信赖在其控制文件中,则可以由任何拥有创造当前数据库的权限。在这种情况下,扩展对象本身将由调用用户拥有,但包含的对象将由引导超级用户拥有(除非扩展脚本明确地将它们分配给调用用户)。此配置使调用用户有权删除扩展,但不能修改其中的单个对象。

# 参数

如果不存在

如果已存在同名扩展,请不要抛出错误。在这种情况下发出通知。请注意,不能保证现有扩展与从当前可用脚本文件创建的扩展相同。

扩展名

要安装的扩展名。PostgreSQL 将使用文件中的详细信息创建扩展共享目录/扩展/扩展名。控制.

模式名称

安装扩展对象的模式的名称,假设扩展允许其内容被重新定位。命名模式必须已经存在。如果未指定,并且扩展的控制文件也未指定模式,则使用当前默认的对象创建模式。

如果扩展名指定一个图式控制文件中的参数,则该模式不能被覆盖架构条款。通常,如果架构给定子句,它与扩展的冲突图式范围。但是,如果级联子句也给出了,那么*模式名称冲突时被忽略。给定的模式名称*将用于安装任何未指定的所需扩展图式在他们的控制文件中。

请记住,扩展本身不被视为在任何模式中:扩展具有非限定名称,在数据库范围内必须是唯一的。但是属于扩展的对象可以在模式中。

版本

要安装的扩展版本。这可以写为标识符或字符串文字。默认版本是扩展控制文件中指定的任何版本。

级联

自动安装此扩展所依赖但尚未安装的任何扩展。它们的依赖项同样会以递归方式自动安装。这架构如果给定子句,则适用于以这种方式安装的所有扩展。该语句的其他选项不适用于自动安装的扩展;特别是,它们的默认版本总是被选中。

# 笔记

在您可以使用之前创建扩展要将扩展加载到数据库中,必须安装扩展的支持文件。关于安装 PostgreSQL 提供的扩展的信息可以在额外提供的模块.

当前可用于加载的扩展可以从pg_available_extensions要么pg_available_extension_versions系统视图。

# 警告

以超级用户身份安装扩展需要相信扩展的作者以安全的方式编写了扩展安装脚本。恶意用户创建特洛伊木马对象并不难,这些对象会危及以后执行粗心编写的扩展脚本,从而允许该用户获得超级用户权限。然而,特洛伊木马对象只有在搜索路径在脚本执行期间,这意味着它们位于扩展的安装目标架构或它所依赖的某个扩展的架构中。因此,在处理其脚本未经仔细审查的扩展时,一个好的经验法则是仅将它们安装到没有并且不会授予任何不受信任的用户的 CREATE 权限的模式中。同样对于他们依赖的任何扩展。

PostgreSQL 提供的扩展被认为可以安全地抵御此类安装时攻击,除了少数依赖于其他扩展的扩展。如这些扩展的文档中所述,它们应该安装到安全模式中,或者安装到与它们所依赖的扩展相同的模式中,或者两者兼而有之。

有关编写新扩展的信息,请参阅第 38.17 节.

# 例子

安装hstore扩展到当前数据库,将其对象放在模式中插件

CREATE EXTENSION hstore SCHEMA addons;

完成同样事情的另一种方法:

SET search_path = addons;
CREATE EXTENSION hstore;

# 兼容性

创建扩展是一个 PostgreSQL 扩展。

# 也可以看看

改变扩展,删除扩展