↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 扩展与访问方法

SQL COMMAND · 扩展与访问方法

CREATE EXTENSION

安装一个扩展

CREATE扩展与访问方法引入 10(基线)现存至 20 devel1 次语法变更

动词
CREATE
对象
EXTENSION
引入版本
10(基线)
状态
现存
语法变更次数
1
手册小节数
6

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 语法未变,正文有更新。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

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

语法概要

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

PostgreSQL 18 手册 · 查看完整参考页

描述

CREATE EXTENSION将一个新扩展装载到当前数据库中。同名扩展不能已经被装载。

装载一个扩展本质上就是运行该扩展的脚本文件。该脚本通常会创建新的 SQL 对象,例如函数、数据类型、操作符以及索引支持方法。CREATE EXTENSION还会记录所有已创建对象的标识,这样在发出DROP EXTENSION时就可以将它们一并删除。

运行CREATE EXTENSION的用户会成为该扩展的所有者,以供后续权限检查之用,并且通常也会成为扩展脚本所创建的任何对象的所有者。

装载扩展通常需要具备创建其组成对象所需的同等权限。对许多扩展来说,这意味着需要超级用户权限。不过,如果扩展在其控制文件中被标记为受信任的,那么任何在当前数据库上拥有 CREATE 权限的用户都可以安装它。在这种情况下,扩展对象本身将由调用用户拥有,但其中包含的对象将由引导超级用户拥有(除非扩展脚本明确把它们赋给调用用户)。这种配置赋予调用用户删除该扩展的权利,但不允许其修改其中的单个对象。

参数

IF NOT EXISTS

如果已存在同名扩展,则不要抛出错误。这种情况下会发出一条提示。注意,这并不保证现有扩展与根据当前可用脚本文件本应创建出的扩展有任何相似之处。

extension_name

要安装的扩展名称。PostgreSQL将根据文件 extension_name.control 中的详细信息创建该扩展;该文件通过服务器的扩展控制路径找到(由extension_control_path设置)。

schema_name

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

如果扩展在其控制文件中指定了 schema 参数,就不能用 SCHEMA 子句覆盖该模式。通常,如果给出了 SCHEMA 子句,且它与扩展的 schema 参数冲突,就会报错。不过,如果同时给出 CASCADE 子句,则发生冲突时会忽略 schema_name。给定的 schema_name 将用于安装任何必需且其控制文件中未指定 schema 的扩展。

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

version

要安装的扩展版本。它可以写成标识符,也可以写成字符串常量。默认版本由扩展控制文件指定。

CASCADE

自动安装该扩展所依赖、但尚未安装的任何扩展。它们的依赖也会以同样的方式递归自动安装。如果给出了 SCHEMA 子句,它将适用于所有以这种方式安装的扩展。该语句的其他选项不会应用于自动安装的扩展;特别是,这些扩展总是选择其默认版本。

注解

在使用 CREATE EXTENSION 将扩展装载到数据库之前,必须先安装好该扩展的支持文件。关于安装 PostgreSQL 随附扩展的信息,可见额外提供的模块。

当前可供装载的扩展可从系统视图 pg_available_extensions 或 pg_available_extension_versions 中查出。

小心

以超级用户身份安装扩展,意味着必须相信扩展作者以安全的方式编写了扩展安装脚本。恶意用户要创建特洛伊木马对象并不算太难;这类对象可能会在之后执行编写不严谨的扩展脚本时实施攻击,使该用户获得超级用户权限。不过,只有当特洛伊木马对象在脚本执行期间位于 search_path 中时,它们才会构成危险;这意味着它们位于扩展的安装目标模式中,或位于它所依赖的某个扩展的目标模式中。因此,处理那些脚本尚未经过仔细审查的扩展时,一个经验法则是:只把它们安装到从未向任何不受信任用户授予、而且今后也不会授予 CREATE 权限的模式中。它们所依赖的任何扩展也应如此。

一般认为,PostgreSQL 随附的扩展能够抵御这类安装时攻击,但少数依赖其他扩展的扩展除外。正如这些扩展的文档所述,它们应当安装到安全模式中,或者安装到与其所依赖扩展相同的模式中,或者同时满足这两点。

关于编写新扩展的信息,见第 36.17 节。

示例

将 hstore 扩展安装到当前数据库中,并把其对象放在 addons 模式中:

CREATE EXTENSION hstore SCHEMA addons;

实现同样效果的另一种方式是:

SET search_path = addons;
CREATE EXTENSION hstore;

兼容性

CREATE EXTENSION 是 PostgreSQL 的扩展。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 20← 19正文更新

    正文更新
  2. PostgreSQL 18← 17正文更新

    正文更新
  3. PostgreSQL 17← 16正文更新

    正文更新
  4. PostgreSQL 14← 13正文更新

    正文更新
  5. PostgreSQL 13← 12语法变化

    − [ FROM old_version ]− [ CASCADE ]正文更新
  6. PostgreSQL 12← 11正文更新

    正文更新
  7. PostgreSQL 11← 10正文更新

    正文更新

同组命令

命令动词对象版本变动最近变更
EXTENSIONS & ACCESS METHODS扩展与访问方法6 条↑
LOADLOAD— —
载入共享库文件现存
CREATE ACCESS METHODCREATEACCESS METHOD —
定义一种新的访问方法现存
DROP ACCESS METHODDROPACCESS METHOD —
移除一个访问方法现存
CREATE EXTENSIONCREATEEXTENSION 131 次
安装一个扩展现存
ALTER EXTENSIONALTEREXTENSION 111 次
更改扩展的定义现存
DROP EXTENSIONDROPEXTENSION —
移除一个扩展现存