CREATE EXTENSION - 安装扩展
CREATE EXTENSION [ IF NOT EXISTS ]extension_name
[ WITH ] [ SCHEMAschema_name
] [ VERSIONversion
] [ CASCADE ]
CREATE EXTENSION
将新的扩展加载到当前数据库中。不得已加载名称相同的扩展。
加载扩展本质上等效于运行扩展的脚本文件。脚本通常将创建新的SQL对象,如函数、数据类型、操作符和索引支持方法。CREATE EXTENSION
此外还记录了所有创建的对象的身份,以便在发出 DROP EXTENSION
时可以再次删除它们。
运行 CREATE EXTENSION
的用户在权限检查时将成为扩展的所有者,并通常也成为扩展脚本所创建的任何对象的所有者。
加载扩展通常需要创建其组件对象所需的相同权限。对于许多扩展来说,这意味着需要超级用户权限。然而,如果扩展在其控制文件中标记为 值得信任,那么任何对当前数据库具有 CREATE
权限的用户都可以安装它。在这种情况下,扩展对象本身将归调用用户所有,但包含的对象将归引导超级用户所有(除非扩展的脚本明确地将它们分配给调用用户)。此配置会赋予调用用户删除扩展的权限,但无法修改扩展中的各个对象。
IF NOT EXISTS
如果已存在同名的扩展,则不会引发错误。在这种情况下会发出通知。请注意,无法保证存在的扩展与当前可用的脚本文件所能创建的扩展有任何相似之处。
extension_name
要安装的扩展的名称。 PostgreSQL 将使用文件 SHAREDIR/extension/
extension_name
.control
中的详细信息创建扩展。
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 扩展。