================== CREATE PUBLICATION ================== .. container:: refentry :name: SQL-CREATEPUBLICATION .. container:: titlepage .. container:: refnamediv .. rubric:: CREATE PUBLICATION :name: create-publication CREATE PUBLICATION — 定义一个新的发布 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis CREATE PUBLICATION name [ FOR TABLE [ ONLY ] table_name [ * ] [, ...] | FOR ALL TABLES ] [ WITH ( publication_parameter [= value] [, ... ] ) ] .. container:: refsect1 :name: id-1.9.3.77.5 .. rubric:: 描述 :name: 描述 ``CREATE PUBLICATION``\ 向当前数据库添加一个新的发布。 发布的名称必须与当前数据库中任何现有发布的名称不同。 发布本质上是一组表,其数据更改旨在通过逻辑复制进行复制。 .. container:: refsect1 :name: id-1.9.3.77.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``name``* 新发布的名称。 ``FOR TABLE`` 指定要添加到发布的表的列表。如果在表名之前指定了\ ``ONLY``\ , 那么只有该表被添加到发布中。如果没有指定\ ``ONLY``\ , 则添加表及其所有后代表(如果有的话)。可选地, 可以在表名之后指定\ ``*``\ 以明确指示包含后代表。 只有持久基表才能成为出版物的一部分。临时表、非日志表、外表、物化视图、 常规视图和分区表不能成为发布的一部分。要复制分区表, 请将各个分区添加到发布中。 ``FOR ALL TABLES`` 将发布标记为复制数据库中所有表的更改,包括在将来创建的表。 ``WITH ( publication_parameter`` [= *``value``*] [, ... ] ) 该子句指定发布的可选参数。支持下列参数: .. container:: variablelist ``publish`` (``string``) 这个参数决定了哪些DML操作将由新的发布发布给订阅者。 该值是用逗号分隔的操作列表。允许的操作是\ ``insert``\ , ``update``\ ,\ ``delete``\ 和\ ``truncate``\ 。 默认是发布所有的动作,所以这个选项的默认值是 ``'insert, update, delete, truncate'``\ 。 .. container:: refsect1 :name: id-1.9.3.77.7 .. rubric:: 注意 :name: 注意 如果既没有指定\ ``FOR TABLE``\ ,也没有指定\ ``FOR ALL TABLES``\ , 那么这个发布就是以一组空表开始的。这在稍后添加表格的情况下是有用的。 创建发布不会开始复制。它只为未来的订阅者定义一个分组和过滤逻辑。 要创建一个发布,调用者必须拥有当前数据库的\ ``CREATE``\ 权限。 (当然,超级用户不需要这个检查。) 要将表添加到发布中,调用者必须拥有该表的所有权。\ ``FOR ALL TABLES`` 子句要求调用者是超级用户。 添加到发布\ ``UPDATE``\ 和/或\ ``DELETE`` 操作的发布的表必须已经定义了\ ``REPLICA IDENTITY``\ 。 否则将在这些表上禁止这些操作。 对于\ ``INSERT ... ON CONFLICT``\ 命令, 发布将公布从命令实际产生的操作。因此,根据结果,它可以作为 ``INSERT``\ 或\ ``UPDATE``\ 发布,也可以根本不发布。 ``COPY ... FROM``\ 命令是作为\ ``INSERT``\ 操作发布的。 不发布DDL操作。 .. container:: refsect1 :name: id-1.9.3.77.8 .. rubric:: 示例 :name: 示例 创建一个发布,发布两个表中所有更改布: .. code:: programlisting CREATE PUBLICATION mypublication FOR TABLE users, departments; 创建一个发布,发布所有表中的所有更改: .. code:: programlisting CREATE PUBLICATION alltables FOR ALL TABLES; 创建一个发布,只发布一个表中的\ ``INSERT``\ 操作: .. code:: programlisting CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert'); .. container:: refsect1 :name: id-1.9.3.77.9 .. rubric:: 兼容性 :name: 兼容性 ``CREATE PUBLICATION``\ 是一个PostgreSQL 扩展。 .. container:: refsect1 :name: id-1.9.3.77.10 .. rubric:: 又见 :name: 又见 `ALTER PUBLICATION `__, `DROP PUBLICATION `__