Postgresql 中文操作指南
Synopsis
CREATE EXTENSION [ IF NOT EXISTS ] extension_name
[ WITH ] [ SCHEMA schema_name ]
[ VERSION version ]
[ CASCADE ]
Description
CREATE EXTENSION 载入一个新扩展至当前数据库。不能已有同名扩展载入。
载入一个扩展本质上等于运行扩展的脚本文件。此脚本通常会创建新的 SQL 对象,例如函数、数据类型、运算符和索引支持方法。 CREATE EXTENSION 还会记录所有已创建对象的标识,以便在发出 DROP EXTENSION 时可以再次删除它们。
运行 CREATE EXTENSION 的用户将成为此扩展的所有者,以便在后来的权限检查中使用,通常还将成为扩展脚本创建的任何对象的的所有者。
加载扩展通常需要创建其组件对象所需的权限。对于许多扩展,这意味着需要超级用户权限。但是,如果扩展的控制文件中将扩展标记为 trusted ,则该扩展可以由对当前数据库拥有 CREATE 权限的任何用户安装。在这种情况下,扩展对象本身归调用用户所有,但包含的对象归 bootstrap 超级用户所有(除非扩展的脚本明确将它们分配给调用用户)。此配置赋予调用用户删除该扩展的权限,但无权修改其中的各个对象。
Parameters
-
IF NOT EXISTS
-
如果已经存在同名的扩展,则不要引发错误。在这种情况下会发出通知。请注意,无法保证现有扩展与当前可用的脚本文件可以创建的扩展相同。
-
-
extension_name
-
要安装的扩展的名称。PostgreSQL 将使用 SHAREDIR/extension/_extension_name.control_ 文件中的详细信息创建扩展。
-
-
schema_name
-
安装扩展对象的架构的名称(如果扩展允许其内容重新定位)。命名的架构必须已经存在。如果未指定,并且扩展的控制文件也没有指定架构,则使用当前默认对象创建架构。
-
如果扩展的控制文件中指定了 schema 参数,则不能使用 SCHEMA 子句覆盖该参数。通常,如果提供了 SCHEMA 子句,并且它与扩展的 schema 参数冲突,则会引发错误。但是,如果还提供了 CASCADE 子句,则在发生冲突时忽略 schema_name 。如果其控制文件中未指定 schema ,则将使用提供的 schema_name 安装所需的扩展。
-
请记住,扩展本身不被视为位于任何架构中:扩展具有在整个数据库中必须唯一的无限定名称。但是,属于扩展的对象可能在架构中。
-
-
version
-
要安装的扩展版本。可以将此版本写为标识符或字符串文本。默认版本是扩展控制文件中指定的任何内容。
-
-
CASCADE
-
自动安装此扩展所依赖的尚未安装的任何扩展。它们的依赖项也同样自动安装,以递归方式进行。如果提供了 SCHEMA 子句,则它适用于所有以这种方式安装的扩展。不会将该语句的其他选项应用于自动安装的扩展;特别是,总是选择它们的默认版本。
-
Notes
在你可以使用 CREATE EXTENSION 将扩展加载到数据库中之前,必须安装扩展的支持文件。有关安装 PostgreSQL 提供的扩展的信息,请参阅 Additional Supplied Modules 。
当前可用于加载的扩展可以从 pg_available_extensions 或 pg_available_extension_versions 系统视图中识别。
Caution
以超级用户身份安装扩展需要相信扩展的作者以安全的方式编写了扩展安装脚本。对于恶意用户来说,创建特洛伊木马对象并不是一件难事,这些对象会损害粗心编写的扩展脚本的后期执行,从而使用户获得超级用户权限。但是,特洛伊木马对象只有在脚本执行期间位于 search_path 中时才具有危害性,这意味着它们位于扩展的安装目标模式或它所依赖的某个扩展的模式中。因此,在处理尚未经过仔细审查的脚本的扩展时,一个好的经验法则是仅将其安装到 CREATE 权限尚未授予且将来不会授予任何不受信任用户的模式中。它们所依赖的任何扩展也应如此。
据信随 PostgreSQL 一起提供的扩展可以防止此类安装时攻击,但依赖于其他扩展的少数扩展除外。如这些扩展文档中所述,应将它们安装到安全的架构中,或者安装到与它们所依赖的扩展相同的架构中,或者同时安装到这两个位置。
有关编写新扩展的信息,请参阅 Section 38.17 。
Examples
将 hstore 扩展安装到当前数据库,将它的对象置于架构 addons 中:
CREATE EXTENSION hstore SCHEMA addons;
另一种完成相同操作的方法:
SET search_path = addons;
CREATE EXTENSION hstore;