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 将使用文件 中的细节来创建该扩展,该文件通过服务器的扩展控制路径找到(由 extension_control_path 设置)。 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 随附的扩展被认为是能抵御这类安装时攻击的,除了少数依赖其他扩展的扩展之外。正如那些扩展的文档中所述,它们应该被安装到安全的模式中,或者安装到与它们所依赖的扩展相同的模式中,或者两者兼而有之。
有关编写新扩展的信息,请参见 Section 36.17。
把 hstore 扩展安装到当前数据库中,并把它的对象放在模式 addons 中:
CREATE EXTENSION hstore SCHEMA addons;
完成同样事情的另一种方法:
SET search_path = addons; CREATE EXTENSION hstore;
CREATE EXTENSION 是 PostgreSQL 的扩展。