CREATE PUBLICATION

CREATE PUBLICATION — define uma nova publicação

Sinopse

CREATE PUBLICATION nome
    [ FOR ALL TABLES |
      FOR objeto_da_publicação [, ... ] ]
    [ WITH ( parâmetro_da_publicação [= valor] [, ... ] ) ]

onde objeto_da_publicação é um entre:

    TABLE [ ONLY ] nome_da_tabela [ * ] [ ( nome_da_coluna [, ... ] ) ]
          [ WHERE ( expressão ) ] [, ... ]
    TABLES IN SCHEMA { nome_do_esquema | CURRENT_SCHEMA } [, ... ]

Descrição

O comando CREATE PUBLICATION define uma nova publicação no banco de dados corrente. O nome da publicação deve ser diferente do nome de qualquer outra publicação existente no banco de dados corrente.

Uma publicação é essencialmente um grupo de tabelas cujas alterações nos dados devem ser replicadas por meio de uma replicação lógica. Veja Publicação para obter detalhes sobre como as publicações se encaixam na configuração de replicação lógica.

Parâmetros

nome #

O nome da nova publicação.

FOR TABLE #

Especifica uma lista de tabelas a serem adicionadas à publicação. Se for especificado ONLY antes do nome da tabela, apenas esta tabela será adicionada à publicação. Se não for especificado ONLY, a tabela e todas as suas tabelas descendentes (se houver) serão adicionadas. Opcionalmente, pode ser especificado * após o nome da tabela, para indicar explicitamente que as tabelas descendentes estão incluídas. Entretanto, isto não se aplica a tabela particionada. As partições das tabelas particionadas são sempre consideradas implicitamente como parte da publicação, portanto, nunca são adicionadas explicitamente à publicação.

Se for especificada a cláusula opcional WHERE, ela irá defini uma expressão de filtro de linha. As linhas para as quais a expressão for avaliada como falsa ou nula não serão publicadas. Observe ser necessário o uso de parênteses em torno da expressão. Não tem efeito sobre os comandos TRUNCATE.

Quando é especificada uma lista de colunas, somente as colunas indicadas são replicadas. A lista de colunas também pode conter colunas geradas e armazenadas. Caso a lista de colunas seja omitida, a publicação irá replicar, por padrão, todas as colunas não geradas (incluindo quaisquer colunas adicionadas no futuro). As colunas geradas e armazenadas também poderão ser replicadas se publish_generated_columns for definido como stored. Especificar uma lista de colunas não tem efeito nos comandos TRUNCATE. Veja Listas de colunas para obter detalhes sobre as listas de colunas.

Somente as tabelas-base persistentes e tabelas particionadas podem fazer parte de uma publicação. Tabelas temporárias, tabelas Unlogged, tabelas estrangeiras, visões materializadas e visões regulares não podem fazer parte de uma publicação.

Especificar uma lista de colunas quando a publicação também publica FOR TABLES IN SCHEMA não tem suporte.

Quando uma tabela particionada é adicionada a uma publicação, todas as suas partições existentes e futuras são implicitamente consideradas como parte da publicação. Portanto, mesmo as operações realizadas diretamente em uma partição também são publicadas por meio de publicações das quais suas ancestrais fazem parte.

FOR ALL TABLES #

Marca a publicação como uma que replica as alterações para todas as tabelas no banco de dados, incluindo as tabelas a serem criadas no futuro.

FOR TABLES IN SCHEMA #

Marca a publicação como uma que replica as alterações para todas as tabelas na lista de esquemas especificada, incluindo as tabelas a serem criadas no futuro.

Não é possível especificar um esquema quando a publicação também publica uma tabela com uma lista de colunas.

Somente as tabelas base persistentes e as tabelas particionadas presentes no esquema serão incluídas na publicação. Tabelas temporárias, tabelas Unlogged, tabelas estrangeiras, visões materializadas e visões regulares do esquema não farão parte da publicação.

Quando uma tabela particionada é publicada por meio de publicação no nível de esquema, todas as suas partições existentes e futuras são implicitamente consideradas parte da publicação, independentemente de pertencerem ou não ao esquema da publicação. Portanto, mesmo as operações realizadas diretamente em uma partição também são publicadas por meio de publicações das quais suas ancestrais fazem parte.

WITH ( parâmetro_da_publicação [= valor] [, ... ] ) #

Esta cláusula especifica parâmetros opcionais para uma publicação. Os seguintes parâmetros têm suporte:

publish (string) #

Este parâmetro determina quais operações de DML serão publicadas pela nova publicação para os assinantes. O valor é uma lista de operações separada por vírgulas. As operações permitidas são insert, update, delete, e truncate. O padrão é publicar todas as operações, portanto, o valor padrão para esta opção é 'insert, update, delete, truncate'.

Este parâmetro afeta apenas as operações de DML. Em particular, a sincronização inicial de dados (veja Seção 29.9.1) para replicação lógica não leva este parâmetro em consideração ao copiar dados de tabelas existentes.

publish_generated_columns (enum) #

Especifica se as colunas geradas presentes nas tabelas associadas à publicação devem ser replicadas. Os valores possíveis são none e stored.

O valor padrão é none, significando que as colunas geradas presentes nas tabelas associadas à publicação não serão replicadas.

Se definido como stored, as colunas geradas e armazenadas presentes nas tabelas associadas à publicação serão replicadas.

Nota

Se o subscritor for de uma versão anterior à 18, a sincronização inicial da tabela não irá copiar as colunas geradas, mesmo se o parâmetro publish_generated_columns no publicador for stored

Veja Replicação de coluna gerada para obter mais detalhes sobre a replicação lógica de colunas geradas.

publish_via_partition_root (boolean) #

Este parâmetro determina se as alterações em uma tabela particionada (ou em suas partições) contidas na publicação serão publicadas usando a identidade e o esquema da tabela particionada, em vez das partições individuais que são realmente alteradas; a última é o padrão. Ativar esta opção permite que as alterações sejam replicadas em uma tabela não particionada, ou em uma tabela particionada que consiste em um conjunto diferente de partições.

Pode haver casos em que uma subscrição combine várias publicações. Se uma tabela particionada for publicada por qualquer subscrição assinada que defina publish_via_partition_root = true, as alterações feitas nesta tabela particionada (ou em suas partições) serão publicadas usando a identidade e o esquema desta tabela particionada, em vez dos das partições individuais.

Este parâmetro também afeta a forma como os filtros de linha e as listas de colunas são escolhidos para as partições; veja detalhes abaixo.

Se esta opção estiver ativa, as operações de TRUNCATE realizadas diretamente nas partições não serão replicadas.

Ao especificar um parâmetro do tipo de dados boolean, a parte = valor pode ser omitida, o que equivale a especificar TRUE.

Notas

Se FOR TABLE, FOR ALL TABLES ou FOR TABLES IN SCHEMA não forem especificados, a publicação começará com um conjunto vazio de tabelas. Isto é útil caso precisem ser adicionadas tabelas ou esquemas posteriormente.

A criação de uma publicação não inicia a replicação. Define apenas uma lógica de agrupamento e filtragem para futuros subscritores.

Para criar uma publicação, o usuário que a cria precisa ter o privilégio CREATE para o banco de dados corrente. (É claro que os superusuários não estão sujeitos esta verificação.)

Para adicionar uma tabela a uma publicação, o usuário que solicita a alteração deve ter direitos de propriedade sobre a tabela. As cláusulas FOR ALL TABLES e FOR TABLES IN SCHEMA requerem que o usuário que invoca o comando seja um superusuário.

As tabelas adicionadas a uma publicação que publica UPDATE e/ou DELETE devem possuir REPLICA IDENTITY definido. Caso contrário, estas operações serão proibidas nessas tabelas.

Qualquer lista de colunas deve incluir as colunas REPLICA IDENTITY para que as operações UPDATE ou DELETE sejam publicadas. Não há restrições de lista de colunas quando a publicação publicar apenas operações INSERT.

Uma expressão de filtro de linha (ou seja, a cláusula WHERE) deve conter apenas colunas abrangidas por REPLICA IDENTITY, para que as operações de UPDATE e DELETE sejam publicadas. Para a publicação de operações de INSERT, qualquer coluna pode ser usada na expressão WHERE. O filtro de linhas permite expressões simples que não possuam funções definidas pelo usuário, operadores definidos pelo usuário, tipos de dados definidos pelo usuário, agrupamentos definidos pelo usuário, funções internas não-imutáveis ​​ou referências a colunas do sistema.

As colunas geradas que fazem parte da REPLICA IDENTITY devem ser publicadas explicitamente, seja listando-as na lista de colunas ou ativando a opção publish_generated_columns, para que as operações UPDATE e DELETE sejam publicadas.

O filtro de linha em uma tabela torna-se redundante se FOR TABLES IN SCHEMA for especificado e a tabela pertencer ao esquema referenciado.

Para tabelas particionadas publicadas, o filtro de linhas para cada partição será obtido da tabela particionada publicada se o parâmetro de publicação publish_via_partition_root for verdade, ou da própria partição se for falso (o padrão). Veja Filtros de linha para obter detalhes sobre os filtros de linha. Da mesma forma, para tabelas particionadas publicadas, a lista de colunas para cada partição será obtida da tabela particionada publicada se o parâmetro de publicação publish_via_partition_root for verdade, ou da própria partição se for falso.

Para um comando INSERT ... ON CONFLICT, a publicação irá publicar a operação resultante do comando. Dependendo do resultado, poderá ser publicado como INSERT ou UPDATE, ou pode não ser publicado de forma alguma.

Para um comando MERGE, a publicação irá mostrar um INSERT, UPDATE ou DELETE para cada linha inserida, atualizada ou excluída.

Anexar (ATTACH) uma tabela a uma árvore de partições cuja raiz é publicada usando uma publicação com publish_via_partition_root definido como verdade não resulta na replicação do conteúdo existente da tabela.

Os comandos COPY ... FROM são publicados como operações INSERT.

As operações de DDL não são publicadas.

A expressão da cláusula WHERE é executada com a função de banco de dados (role) usada para a conexão de replicação.

Exemplos

Criar uma publicação que publica todas as alterações em duas tabelas:

CREATE PUBLICATION mypublication
    FOR TABLE users, departments;

Criar uma publicação que publica todas as alterações dos departamentos ativos:

CREATE PUBLICATION active_departments
    FOR TABLE departments
    WHERE (active IS TRUE);

Criar uma publicação que publica todas as alterações em todas as tabelas:

CREATE PUBLICATION alltables
    FOR ALL TABLES;

Criar uma publicação que publica apenas operações de INSERT em uma tabela:

CREATE PUBLICATION insert_only
    FOR TABLE mydata
    WITH (publish = 'insert');

Criar uma publicação que publica todas as alterações nas tabelas. users, departments e todas as alterações para todas as tabelas presentes no esquema production:

CREATE PUBLICATION production_publication
    FOR TABLE users, departments,
    TABLES IN SCHEMA production;

Criar uma publicação que publica todas as alterações para todas as tabelas presentes nos esquemas marketing e sales:

CREATE PUBLICATION sales_publication
    FOR TABLES IN SCHEMA marketing, sales;

Criar uma publicação que publica todas as alterações da tabela users, mas replica apenas as colunas user_id e firstname:

CREATE PUBLICATION users_filtered
    FOR TABLE users (user_id, firstname);

Conformidade

O comando CREATE PUBLICATION é uma extensão do PostgreSQL.

Veja também

ALTER PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION, pg_publication_tables