Assinaturas atualizáveis - Para replicação transacional

Aplica-se:SQL Server

Observação

Este recurso permanecerá com suporte em versões do SQL Server de 2012 até 2016. Esse recurso será removido em uma versão futura do SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.

Replicação transacional oferece suporte para atualizações em Assinantes por meio de assinaturas atualizáveis e replicação ponto a ponto. A seguir, dois tipos de assinaturas atualizáveis:

  • Atualização imediata. O Publicador e o Assinante devem estar conectados para atualizar os dados no Assinante.

  • Atualização em fila O Publicador e o Assinante não precisam estar conectados para atualizar os dados no Assinante. Você pode atualizar os dados enquanto o Assinante ou Publisher estiver offline.

Quando você atualiza dados em um Assinante, a atualização primeiro vai para o Publisher e depois para outros Assinantes. Se você usar atualização imediata, as mudanças são feitas imediatamente usando o protocolo de commit em duas fases. Se você usar atualização enfileirada, as alterações entram em uma fila. As transações em fila vão para o Publisher de forma assíncrona quando a conectividade de rede está disponível. Como as atualizações vão para o Publisher de forma assíncrona, os mesmos dados podem ser atualizados pelo Publisher ou por outro Assinante, e conflitos podem ocorrer ao aplicar as atualizações. O sistema detecta e resolve conflitos de acordo com uma política de resolução de conflitos que você define ao criar a publicação.

Se você criar uma publicação transacional com assinaturas atualizáveis no Assistente de Nova Publicação, tanto a atualização imediata quanto a atualização em fila serão habilitadas. Se você criar uma publicação com procedimentos armazenados, é possível habilitar uma ou ambas as opções. Ao criar uma assinatura para a publicação, você especifica o modo de atualização a ser usado. É possível então alternar entre modos de atualização se necessário. Para obter mais informações, consulte a seguinte seção "Alternando entre modos de atualização".

Para habilitar assinaturas atualizáveis para publicações transacionais, veja Habilitar Atualização de Assinaturas para Publicações Transacionais.

Para criar assinaturas atualizáveis para publicações transacionais, veja Criar uma Assinatura Atualizável para uma Publicação Transacional (Management Studio).

Alternando entre modos de atualização

Quando você usa assinaturas atualizáveis, pode especificar um modo de atualização para uma assinatura e trocar para o outro modo se o aplicativo exigir. Por exemplo, você pode especificar que uma assinatura use atualização imediata, mas mude para atualização em fila se uma falha do sistema resultar na perda da conectividade da rede.

Observação

A replicação não alterna automaticamente entre os modos de atualização. Configure o modo de atualização através do SQL Server Management Studio ou chame sp_setreplfailovermode (Transact-SQL) no seu aplicativo para alternar entre modos.

Se você mudar de atualização imediata para atualização em fila, não pode voltar para atualização imediata até que o Assinante e o Publisher estejam conectados e o Agente Leitor de Fila aplique todas as mensagens pendentes na fila ao Publisher.

Para alternar entre modos de atualização

Para alternar entre modos de atualização, ative a publicação e a assinatura para ambos os modos de atualização, e então alterne entre eles se necessário. Para obter mais informações, consulte
Alternar entre modos de atualização para uma assinatura transacional atualizável

Considerações para o uso de assinaturas atualizáveis

  • Depois de ativar uma publicação para atualizar assinaturas ou assinaturas de atualização em fila, você não pode desativar a opção para a publicação (embora as assinaturas não precisem usá-la). Para desativar essa opção, exclua a publicação e crie uma nova.

  • Republicar dados não é suportado.

  • A replicação adiciona a coluna msrepl_tran_version às tabelas publicadas para fins de rastreamento. Devido a essa coluna extra, inclua uma lista de colunas em todos os comandos INSERT.

  • Para fazer alterações no esquema de uma tabela em uma publicação que oferece suporte à atualização de assinaturas, interrompa toda a atividade na tabela no Publicador e nos Assinantes e propague as alterações de dados pendentes para todos os nós antes de fazer qualquer alteração no esquema. Esse processo garante que as transações pendentes não entrem em conflito com a alteração de esquema pendente. Após as alterações no esquema serem propagadas para todos os nós, as atividades podem ser retomadas nas tabelas publicadas. Para obter mais informações, confira Como confirmar uma topologia de replicação (Programação Transact-SQL de replicação).

  • Para alternar entre os modos de atualização, o Agente Leitor de Fila deve rodar pelo menos uma vez após a inicialização da assinatura (por padrão, o Agente Leitor de Fila roda continuamente).

  • Se o banco de dados do Assinante estiver particionado horizontalmente e houver linhas na partição que existem no Assinante, mas não no Publisher, o Assinante não pode atualizar as linhas pré-existentes. A tentativa de atualizar essas linhas retorna um erro. Exclua as linhas da tabela e depois adicione-as no Publisher.

  • A replicação transacional com assinantes atualizáveis em fila pode apresentar desempenho lento quando são usados índices filtrados únicos. Se ocorrer um conflito em um artigo que possui índices filtrados únicos, a resolução de conflitos leva a excluções e inserções extras no assinante para as linhas que não são cobertas pelo índice filtrado único.

Atualizações no Assinante

  • As atualizações no Assinante se propagam para o Publisher mesmo que uma assinatura esteja expirada ou inativa. Certifique-se de cancelar ou reinicializar qualquer uma dessas assinaturas.

  • Se você usar colunas TIMESTAMP ou IDENTITY e replicá-las como seus tipos de dados básicos, não atualize os valores dessas colunas no Assinante.

  • Assinantes não podem atualizar ou inserir texto, ntext ou valores de imagem porque os gatilhos de rastreamento de mudanças de replicação não conseguem ler das tabelas inseridas ou excluídas. Da mesma forma, Assinantes não podem atualizar ou inserir valores de texto ou imagem usando WRITETEXT ou UPDATETEXT porque o Publisher sobrescrive os dados. Em vez disso, você poderia particionar as colunas de texto e imagem em uma tabela separada e modificar ambas as tabelas dentro de uma transação.

    Para atualizar objetos de grande porte em um Assinante, use os tipos de dados varchar(max), nvarchar(max) e varbinary(max) em vez dos tipos de dados text, ntext e image, respectivamente.

  • Atualizações de chaves únicas (incluindo chaves primárias) que geram duplicados, como uma atualização do formulário UPDATE <column> SET <column> =<column>+1, não são permitidas e são rejeitadas devido a uma violação de unicidade. Defina atualizações feitas na propagação do Assinante por replicação como instruções UPDATE individuais para cada linha afetada.

  • Se o banco de dados do Assinante estiver particionado horizontalmente e a partição contiver linhas que existem no Assinante, mas não no Publisher, o Assinante não pode atualizar as linhas pré-existentes. A tentativa de atualizar essas linhas retorna um erro. Exclua e reinsira essas linhas.

Gatilhos definidos pelo usuário

  • Se a aplicação exigir gatilhos no Assinante, defina os gatilhos com a opção NOT FOR REPLICATION no Publicador e no Assinante. Essa opção garante que os gatilhos sejam acionados somente para a alteração original nos dados, mas não quando a replicação propagar essa alteração.

    Certifique-se de que o gatilho definido pelo usuário não dispare quando o gatilho de replicação atualizar a tabela. Execute o procedimento sp_check_for_sync_trigger no corpo do gatilho definido pelo usuário. Para obter mais informações, veja sp_check_for_sync_trigger (Transact-SQL).

Atualização imediata

  • Para assinaturas de atualização imediata, as alterações no Assinante se propagam para o Publicador e são aplicadas por meio do Coordenador de Transações Distribuídas da Microsoft (MS DTC). Certifique-se de que o MS DTC está instalado e configurado no Publicador e no Assinante. Para obter mais informações, consulte a documentação do Windows.

  • Os gatilhos usados pelas assinaturas de atualização imediata exigem uma conexão com o Publicador para replicar as alterações.

  • Se a publicação permitir assinaturas de atualização imediata e um artigo da publicação tiver um filtro de coluna, você não poderá filtrar colunas não anuláveis sem valores padrão.

Atualização enfileirada

  • Você não pode publicar tabelas incluídas em uma publicação de fusão como parte de uma publicação transacional que permite atualizações em fila.

  • Não atualize as colunas da chave primária ao usar a atualização em fila, porque a chave primária serve como localizador de registros para todas as consultas. Quando a política de resolução de conflitos for definida como Assinante vence, tome cuidado ao atualizar as chaves primárias. Se tanto o Publisher quanto o Assinante atualizarem a chave primária, o resultado são duas linhas com chaves primárias diferentes.

  • Para colunas do tipo de dado SQL_VARIANT: quando os dados são inseridos ou atualizados no Assinante, o Agente Leitor de Fila os mapeia da seguinte forma ao copiar os dados do Assinante para a fila:

    • BIGINT, DECIMAL, NUMERIC, MONEY e SMALLMONEY são mapeados para NUMERIC.

    • BINARY e VARBINARY são mapeados para dados VARBINARY.

Detecção e resolução de conflitos

  • Para a política de conflito Subscriber Wins: a resolução de conflitos não oferece suporte a atualizações nas colunas de chave primária.

  • A replicação não resolve conflitos devido a falhas de restrições de chave estrangeira:

    • Se você não prevê conflitos e os dados estão bem particionados (os Assinantes não atualizam as mesmas linhas), use restrições de chave estrangeira no Publicador e nos Assinantes.

    • Se você espera conflitos: não use restrições de chave estrangeira no Publisher ou Subscriber se usar "Subscriber vence" para resolução de conflitos. Não use restrições de chave estrangeira no Assinante caso você use a resolução de conflitos "Editor vence".