|
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>CREATE EXTENSION</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets V1.79.1" /><link rel="prev" href="sql-createeventtrigger.html" title="CREATE EVENT TRIGGER" /><link rel="next" href="sql-createforeigndatawrapper.html" title="CREATE FOREIGN DATA WRAPPER" /></head><body><div xmlns="http://www.w3.org/TR/xhtml1/transitional" class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">CREATE EXTENSION</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="sql-createeventtrigger.html" title="CREATE EVENT TRIGGER">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="sql-commands.html" title="SQL Commands">Up</a></td><th width="60%" align="center">SQL Commands</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 12.4 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="sql-createforeigndatawrapper.html" title="CREATE FOREIGN DATA WRAPPER">Next</a></td></tr></table><hr></hr></div><div class="refentry" id="SQL-CREATEEXTENSION"><div class="titlepage"></div><a id="id-1.9.3.64.1" class="indexterm"></a><div class="refnamediv"><h2><span class="refentrytitle">CREATE EXTENSION</span></h2><p>CREATE EXTENSION — install an extension</p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
- CREATE EXTENSION [ IF NOT EXISTS ] <em class="replaceable"><code>extension_name</code></em>
- [ WITH ] [ SCHEMA <em class="replaceable"><code>schema_name</code></em> ]
- [ VERSION <em class="replaceable"><code>version</code></em> ]
- [ FROM <em class="replaceable"><code>old_version</code></em> ]
- [ CASCADE ]
- </pre></div><div class="refsect1" id="id-1.9.3.64.5"><h2>Description</h2><p>
- <code class="command">CREATE EXTENSION</code> loads a new extension into the current
- database. There must not be an extension of the same name already loaded.
- </p><p>
- Loading an extension essentially amounts to running the extension's script
- file. The script will typically create new <acronym class="acronym">SQL</acronym> objects such as
- functions, data types, operators and index support methods.
- <code class="command">CREATE EXTENSION</code> additionally records the identities
- of all the created objects, so that they can be dropped again if
- <code class="command">DROP EXTENSION</code> is issued.
- </p><p>
- Loading an extension requires the same privileges that would be
- required to create its component objects. For most extensions this
- means superuser or database owner privileges are needed.
- The user who runs <code class="command">CREATE EXTENSION</code> becomes the
- owner of the extension for purposes of later privilege checks, as well
- as the owner of any objects created by the extension's script.
- </p></div><div class="refsect1" id="id-1.9.3.64.6"><h2>Parameters</h2><div class="variablelist"><dl class="variablelist"><dt><span class="term"><code class="literal">IF NOT EXISTS</code></span></dt><dd><p>
- Do not throw an error if an extension with the same name already
- exists. A notice is issued in this case. Note that there is no
- guarantee that the existing extension is anything like the one that
- would have been created from the currently-available script file.
- </p></dd><dt><span class="term"><em class="replaceable"><code>extension_name</code></em></span></dt><dd><p>
- The name of the extension to be
- installed. <span class="productname">PostgreSQL</span> will create the
- extension using details from the file
- <code class="literal">SHAREDIR/extension/</code><em class="replaceable"><code>extension_name</code></em><code class="literal">.control</code>.
- </p></dd><dt><span class="term"><em class="replaceable"><code>schema_name</code></em></span></dt><dd><p>
- The name of the schema in which to install the extension's
- objects, given that the extension allows its contents to be
- relocated. The named schema must already exist.
- If not specified, and the extension's control file does not specify a
- schema either, the current default object creation schema is used.
- </p><p>
- If the extension specifies a <code class="literal">schema</code> parameter in its
- control file, then that schema cannot be overridden with
- a <code class="literal">SCHEMA</code> clause. Normally, an error will be raised if
- a <code class="literal">SCHEMA</code> clause is given and it conflicts with the
- extension's <code class="literal">schema</code> parameter. However, if
- the <code class="literal">CASCADE</code> clause is also given,
- then <em class="replaceable"><code>schema_name</code></em> is
- ignored when it conflicts. The
- given <em class="replaceable"><code>schema_name</code></em> will be
- used for installation of any needed extensions that do not
- specify <code class="literal">schema</code> in their control files.
- </p><p>
- Remember that the extension itself is not considered to be within any
- schema: extensions have unqualified names that must be unique
- database-wide. But objects belonging to the extension can be within
- schemas.
- </p></dd><dt><span class="term"><em class="replaceable"><code>version</code></em></span></dt><dd><p>
- The version of the extension to install. This can be written as
- either an identifier or a string literal. The default version is
- whatever is specified in the extension's control file.
- </p></dd><dt><span class="term"><em class="replaceable"><code>old_version</code></em></span></dt><dd><p>
- <code class="literal">FROM</code> <em class="replaceable"><code>old_version</code></em>
- must be specified when, and only when, you are attempting to install
- an extension that replaces an <span class="quote">“<span class="quote">old style</span>”</span> module that is just
- a collection of objects not packaged into an extension. This option
- causes <code class="command">CREATE EXTENSION</code> to run an alternative installation
- script that absorbs the existing objects into the extension, instead
- of creating new objects. Be careful that <code class="literal">SCHEMA</code> specifies
- the schema containing these pre-existing objects.
- </p><p>
- The value to use for <em class="replaceable"><code>old_version</code></em> is determined by the
- extension's author, and might vary if there is more than one version
- of the old-style module that can be upgraded into an extension.
- For the standard additional modules supplied with pre-9.1
- <span class="productname">PostgreSQL</span>, use <code class="literal">unpackaged</code>
- for <em class="replaceable"><code>old_version</code></em> when
- updating a module to extension style.
- </p></dd><dt><span class="term"><code class="literal">CASCADE</code></span></dt><dd><p>
- Automatically install any extensions that this extension depends on
- that are not already installed. Their dependencies are likewise
- automatically installed, recursively. The <code class="literal">SCHEMA</code> clause,
- if given, applies to all extensions that get installed this way.
- Other options of the statement are not applied to
- automatically-installed extensions; in particular, their default
- versions are always selected.
- </p></dd></dl></div></div><div class="refsect1" id="id-1.9.3.64.7"><h2>Notes</h2><p>
- Before you can use <code class="command">CREATE EXTENSION</code> to load an extension
- into a database, the extension's supporting files must be installed.
- Information about installing the extensions supplied with
- <span class="productname">PostgreSQL</span> can be found in
- <a class="link" href="contrib.html" title="Appendix F. Additional Supplied Modules">Additional Supplied Modules</a>.
- </p><p>
- The extensions currently available for loading can be identified from the
- <a class="link" href="view-pg-available-extensions.html" title="51.66. pg_available_extensions"><code class="structname">pg_available_extensions</code></a>
- or
- <a class="link" href="view-pg-available-extension-versions.html" title="51.67. pg_available_extension_versions"><code class="structname">pg_available_extension_versions</code></a>
- system views.
- </p><div class="caution"><h3 class="title">Caution</h3><p>
- Installing an extension as superuser requires trusting that the
- extension's author wrote the extension installation script in a secure
- fashion. It is not terribly difficult for a malicious user to create
- trojan-horse objects that will compromise later execution of a
- carelessly-written extension script, allowing that user to acquire
- superuser privileges. However, trojan-horse objects are only hazardous
- if they are in the <code class="varname">search_path</code> during script
- execution, meaning that they are in the extension's installation target
- schema or in the schema of some extension it depends on. Therefore, a
- good rule of thumb when dealing with extensions whose scripts have not
- been carefully vetted is to install them only into schemas for which
- CREATE privilege has not been and will not be granted to any untrusted
- users. Likewise for any extensions they depend on.
- </p><p>
- The extensions supplied with <span class="productname">PostgreSQL</span> are
- believed to be secure against installation-time attacks of this sort,
- except for a few that depend on other extensions. As stated in the
- documentation for those extensions, they should be installed into secure
- schemas, or installed into the same schemas as the extensions they
- depend on, or both.
- </p></div><p>
- For information about writing new extensions, see
- <a class="xref" href="extend-extensions.html" title="37.17. Packaging Related Objects into an Extension">Section 37.17</a>.
- </p></div><div class="refsect1" id="id-1.9.3.64.8"><h2>Examples</h2><p>
- Install the <a class="link" href="hstore.html" title="F.16. hstore">hstore</a> extension into the
- current database, placing its objects in schema <code class="literal">addons</code>:
- </p><pre class="programlisting">
- CREATE EXTENSION hstore SCHEMA addons;
- </pre><p>
- Another way to accomplish the same thing:
- </p><pre class="programlisting">
- SET search_path = addons;
- CREATE EXTENSION hstore;
- </pre><p>
- </p><p>
- Update a pre-9.1 installation of <code class="literal">hstore</code> into
- extension style:
- </p><pre class="programlisting">
- CREATE EXTENSION hstore SCHEMA public FROM unpackaged;
- </pre><p>
- Be careful to specify the schema in which you installed the existing
- <code class="literal">hstore</code> objects.
- </p></div><div class="refsect1" id="id-1.9.3.64.9"><h2>Compatibility</h2><p>
- <code class="command">CREATE EXTENSION</code> is a <span class="productname">PostgreSQL</span>
- extension.
- </p></div><div class="refsect1" id="id-1.9.3.64.10"><h2>See Also</h2><span class="simplelist"><a class="xref" href="sql-alterextension.html" title="ALTER EXTENSION"><span class="refentrytitle">ALTER EXTENSION</span></a>, <a class="xref" href="sql-dropextension.html" title="DROP EXTENSION"><span class="refentrytitle">DROP EXTENSION</span></a></span></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="sql-createeventtrigger.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="sql-commands.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="sql-createforeigndatawrapper.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">CREATE EVENT TRIGGER </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> CREATE FOREIGN DATA WRAPPER</td></tr></table></div></body></html>
|