CREATE PUBLICATION — define uma nova publicação
CREATE PUBLICATIONnome[ FOR ALL TABLES | FORobjeto_da_publicação[, ... ] ] [ WITH (parâmetro_da_publicação[=valor] [, ... ] ) ] ondeobjeto_da_publicaçãoé um entre: TABLE [ ONLY ]nome_da_tabela[ * ] [ (nome_da_coluna[, ... ] ) ] [ WHERE (expressão) ] [, ... ] TABLES IN SCHEMA {nome_do_esquema| CURRENT_SCHEMA } [, ... ]
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.
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.
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.
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.
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);
O comando CREATE PUBLICATION é uma extensão do
PostgreSQL.