<!--
doc/src/sgml/ref/create_server.sgml
PostgreSQL documentation
-->

<refentry id="sql-createserver">
 <indexterm zone="sql-createserver">
  <primary>CREATE SERVER</primary>
 </indexterm>

 <refmeta>
  <refentrytitle>CREATE SERVER</refentrytitle>
  <manvolnum>7</manvolnum>
  <refmiscinfo>SQL - Language Statements</refmiscinfo>
 </refmeta>

 <refnamediv>
  <refname>CREATE SERVER</refname>
  <refpurpose>define a new foreign server</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
<synopsis>
CREATE SERVER [ IF NOT EXISTS ] <replaceable class="parameter">server_name</replaceable> [ TYPE '<replaceable class="parameter">server_type</replaceable>' ] [ VERSION '<replaceable class="parameter">server_version</replaceable>' ]
    FOREIGN DATA WRAPPER <replaceable class="parameter">fdw_name</replaceable>
    [ OPTIONS ( [ mpp_execute 'any | master | all segments' ], <replaceable class="parameter">option</replaceable> '<replaceable class="parameter">value</replaceable>' [, ... ] ) ]
</synopsis>
 </refsynopsisdiv>

 <refsect1>
  <title>Description</title>

  <para>
   <command>CREATE SERVER</command> defines a new foreign server.  The
   user who defines the server becomes its owner.
  </para>

  <para>
   A foreign server typically encapsulates connection information that
   a foreign-data wrapper uses to access an external data resource.
   Additional user-specific connection information may be specified by
   means of user mappings.
  </para>

  <para>
   The server name must be unique within the database.
  </para>

  <para>
   Creating a server requires <literal>USAGE</literal> privilege on the
   foreign-data wrapper being used.
  </para>
 </refsect1>

 <refsect1>
  <title>Parameters</title>

  <variablelist>
  <varlistentry>
    <term><literal>IF NOT EXISTS</literal></term>
    <listitem>
     <para>
      Do not throw an error if a server with the same name already exists.
      A notice is issued in this case.  Note that there is no guarantee that
      the existing server is anything like the one that would have been
      created.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">server_name</replaceable></term>
    <listitem>
     <para>
      The name of the foreign server to be created.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">server_type</replaceable></term>
    <listitem>
     <para>
      Optional server type, potentially useful to foreign-data wrappers.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">server_version</replaceable></term>
    <listitem>
     <para>
      Optional server version, potentially useful to foreign-data wrappers.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">fdw_name</replaceable></term>
    <listitem>
     <para>
      The name of the foreign-data wrapper that manages the server.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><literal>OPTIONS ( [ mpp_execute 'any | master | all segments' ], <replaceable class="parameter">option</replaceable> '<replaceable class="parameter">value</replaceable>' [, ... ] )</literal></term>
    <listitem>
     <para>
      This clause specifies the options for the server.  The options
      typically define the connection details of the server, but the
      actual names and values are dependent on the server's
      foreign-data wrapper.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="PARAMETER">mpp_execute</replaceable></term>
    <listitem>
     <para>
     MASTER, FDW requests for data from master.

     ANY, FDW requests for data from master or one any segment, depends on
     which path costs less.

     ALL SEGMENTS, FDW requests for data from all segments, wrappers need to
     have a policy matching the segments to data.

     A mpp_execute option setting in a foreign table of this foreign server
     takes precedence.
     </para>
    </listitem>
   </varlistentry>

  </variablelist>
 </refsect1>

 <refsect1>
  <title>Notes</title>

  <para>
   When using the <xref linkend="dblink"/> module,
   a foreign server's name can be used
   as an argument of the <xref linkend="contrib-dblink-connect"/>
   function to indicate the connection parameters.  It is necessary to have
   the <literal>USAGE</literal> privilege on the foreign server to be
   able to use it in this way.
  </para>
 </refsect1>

 <refsect1>
  <title>Examples</title>

  <para>
   Create a server <literal>myserver</literal> that uses the
   foreign-data wrapper <literal>postgres_fdw</literal>:
<programlisting>
CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');
</programlisting>
   See <xref linkend="postgres-fdw"/> for more details.
  </para>
 </refsect1>

 <refsect1>
  <title>Compatibility</title>

  <para>
   <command>CREATE SERVER</command> conforms to ISO/IEC 9075-9 (SQL/MED).
  </para>
 </refsect1>

 <refsect1>
  <title>See Also</title>

  <simplelist type="inline">
   <member><xref linkend="sql-alterserver"/></member>
   <member><xref linkend="sql-dropserver"/></member>
   <member><xref linkend="sql-createforeigndatawrapper"/></member>
   <member><xref linkend="sql-createforeigntable"/></member>
   <member><xref linkend="sql-createusermapping"/></member>
  </simplelist>
 </refsect1>

</refentry>
