Assinaturas atualizáveis – para a replicação transacionalUpdatable Subscriptions - For Transactional Replication

APLICA-SE A: SimSQL Server NãoBanco de Dados SQL do Azure NãoAzure Synapse Analytics (SQL DW) NãoParallel Data Warehouse APPLIES TO: YesSQL Server NoAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Observação

Este recurso permanecerá com suporte em versões do SQL ServerSQL Server de 2012 até 2016.This feature remains supported in versions of SQL ServerSQL Server from 2012 through 2016. Este recurso está em modo de manutenção e talvez seja removido em uma versão futura do Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Replicação transacional oferece suporte para atualizações em Assinantes por meio de assinaturas atualizáveis e replicação ponto a ponto.Transactional replication supports updates at Subscribers through updatable subscriptions and peer-to-peer replication. A seguir, dois tipos de assinaturas atualizáveis:The following are the two types of updatable subscriptions:

  • Atualização imediata.Immediate updating. O Publicador e o Assinante devem estar conectados para atualizar dados no Assinante.The Publisher and Subscriber must be connected to update data at the Subscriber.

  • A atualização em fila do Publicador e Assinante não precisa estar conectada para atualizar dados no Assinante.Queued updating The Publisher and Subscriber do not have to be connected to update data at the Subscriber. As atualizações podem ser feitas enquanto o Assinante ou o Publicador está offline.Updates can be made while the Subscriber or Publisher is offline.

Quando os dados são atualizados em um Assinante, eles são primeiro propagados para o Publicador e, então, para outros Assinantes.When data is updated at a Subscriber, it is first propagated to the Publisher and then propagated to other Subscribers. Se a atualização imediata for usada, as alterações são propagadas imediatamente usando-se o protocolo de confirmação de duas fases.If immediate updating is used, the changes are propagated immediately using the two-phase commit protocol. Se a atualização enfileirada for usada, as alterações são armazenadas em uma fila; as transações enfileiradas são então aplicadas de forma assíncrona no Publicador sempre que a conectividade de rede estiver disponível.If queued updating is used, the changes are stored in a queue; the queued transactions are then applied asynchronously at the Publisher whenever network connectivity is available. Como as atualizações são propagadas de forma assíncrona para o Publicador, os mesmos dados podem ter sido atualizados pelo Publicador ou por outro Assinante, podendo ocorrer conflitos ao se aplicar as atualizações.Because the updates are propagated asynchronously to the Publisher, the same data may have been updated by the Publisher or by another Subscriber and conflicts can occur when applying the updates. Conflitos são detectados e resolvidos de acordo com uma política de resolução de conflito estabelecida quando a publicação é criada.Conflicts are detected and resolved according to a conflict resolution policy that is set when creating the publication.

Se você criar uma publicação transacional com assinaturas atualizáveis no Assistente para Nova Publicação, tanto a atualização imediata quanto a enfileirada são habilitadas.If you create a transactional publication with updatable subscriptions in the New Publication Wizard, both immediate updating and queued updating are enabled. Se você criar uma publicação com procedimentos armazenados, é possível habilitar uma ou ambas as opções.If you create a publication with stored procedures, you can enable one or both options. Ao criar uma assinatura para a publicação, você especifica o modo de atualização a ser usado.When you create a subscription to the publication, you specify which update mode to use. É possível então alternar entre modos de atualização se necessário.You can then switch between update modes if necessary. Para obter mais informações, consulte a seguinte seção "Alternando entre modos de atualização".For more information, see the following section "Switching between Update Modes".

Para habilitar assinaturas atualizáveis para publicações transacionais, Habilitar atualização de assinaturas para publicações transacionaisTo enable updatable subscriptions for transactional publications, Enable Updating Subscriptions for Transactional Publications

Para criar assinaturas atualizáveis para publicações transacionais, consulte Criar uma assinatura atualizável para uma publicação transacional (Management Studio)To create updatable subscriptions for transactional publications, see Create an Updatable Subscription to a Transactional Publication (Management Studio)

Alternando entre modos de atualizaçãoSwitching Between Update Modes

Ao usar assinaturas atualizáveis você pode especificar que uma assinatura use um modo de atualização e, então, passe para o outro se o aplicativo assim o exigir.When using updatable subscriptions you can specify that a subscription should use one update mode and then switch to the other if the application requires it. Por exemplo, é possível especificar que uma assinatura use atualização imediata, mas alterne para atualização enfileirada se uma falha do sistema resultar na perda de conectividade de rede.For example, you can specify that a subscription should use immediate updating, but switch to queued updating if a system failure results in the loss of network connectivity.

Observação

Replicação não alterna automaticamente entre modos de atualização.Replication does not switch automatically between update modes. Você deve definir o modo de atualização por meio do SQL Server Management Studio ou seu aplicativo deve chamar sp_setreplfailovermode (Transact-SQL) para alternar entre os modos.You must set the update mode through SQL Server Management Studio or your application must call sp_setreplfailovermode (Transact-SQL) to switch between modes.

Se você alternar de atualização imediata para atualização enfileirada, não é possível alternar de volta para atualização imediata até que o Assinante ou Publicador esteja conectado e o Agente de Leitor de Fila tenha aplicado todas as mensagens pendentes na fila para o Publicador.If you switch from immediate updating to queued updating, you cannot switch back to immediate updating until the Subscriber and Publisher are connected and the Queue Reader Agent has applied all pending messages in the queue to the Publisher.

Para alternar entre modos de atualizaçãoTo switch between update modes

Para alternar entre modos de atualização, deve-se habilitar a publicação e a assinatura para ambos os modos de atualização e, então, alternar entre eles, se necessário.To switch between updating modes, you must enable the publication and subscription for both update modes, and then switch between them if necessary. Para obter mais informações, consulteFor more information, see
Alternar entre modos de atualização para uma assinatura transacional atualizávelSwitch Between Update Modes for an Updatable Transactional Subscription.

Considerações para o uso de assinaturas atualizáveisConsiderations for Using Updatable Subscriptions

  • Depois que uma publicação é habilitada para assinaturas de atualização ou assinaturas de atualização enfileiradas, a opção não pode ser desabilitada para a publicação (embota assinaturas não precisem usá-la).After a publication is enabled for updating subscriptions or queued updating subscriptions, the option cannot be disabled for the publication (although subscriptions do not need to use it). Para desabilitar a opção, a publicação deve ser excluída e uma nova deve ser criada.To disable the option, the publication must be deleted and a new one created.

  • Dados de republicação não oferecem suporte.Republishing data is not supported.

  • A replicação adiciona a coluna msrepl_tran_version a tabelas publicadas para propósitos de rastreamento.Replication adds the msrepl_tran_version column to published tables for tracking purposes. Devido à coluna adicional, todas as instruções INSERT devem incluir uma lista de colunas.Because of this additional column, all INSERT statements should include a column list.

  • Para efetuar alterações de esquema em uma tabela em uma publicação que ofereça suporte a assinaturas de atualização, toda a atividade na tabela deve ser interrompida no Publicador e Assinantes, e alterações de dados pendentes devem ser propagadas a todos os nós antes de fazer qualquer alteração de esquema.To make schema changes on a table in a publication that supports updating subscriptions, all activity on the table must be stopped at the Publisher and Subscribers, and pending data changes must be propagated to all nodes before making any schema changes. Isso assegura que transações pendentes não entrem em conflito com a alteração de esquema pendente.This ensures that outstanding transactions do not conflict with the pending schema change. Depois que as alterações de esquema tenham se propagado para todos os nós, a atividade pode ser retomada nas tabelas publicadas.After the schema changes have propagated to all nodes, activity can resume on the published tables. Para obter mais informações, consulte Como confirmar uma topologia de replicação (Programação Transact-SQL de replicação).For more information, see Quiesce a Replication Topology (Replication Transact-SQL Programming).

  • Se você planeja alternar entre modos de atualização, o Agente de Leitor de Fila deve ser executado pelo menos uma vez depois de a assinatura ser inicializada (por padrão, o Agente de Leitor de Fila é executado de forma contínua).If you plan to switch between update modes, the Queue Reader Agent must run at least once after the subscription has been initialized (by default, the Queue Reader Agent runs continuously).

  • Se o banco de dados do Assinante for particionado horizontalmente e houver linhas na partição que existam no Assinante, mas não no Publicador, o Assinante não pode atualizar as linhas preexistentes.If the Subscriber database is partitioned horizontally and there are rows in the partition that exist at the Subscriber, but not at the Publisher, the Subscriber cannot update the preexisting rows. A tentativa de atualizar essas linhas retorna um erro.Attempting to update these rows returns an error. As linhas devem ser excluídas da tabela e, então, adicionadas ao Publicador.The rows should be deleted from the table and then added at the Publisher.

  • A replicação transacional com assinantes atualizáveis na fila pode apresentar um desempenho lento quando índices exclusivos filtrados são usados.Transactional replication with Queued updateable subscribers could experience slow performance when unique filtered indexes are used. Se ocorrer um conflito em um artigo que tem índices filtrados exclusivos e a resolução de conflitos levaria a exclusões e inserções adicionais no assinante para as linhas que não são cobertas pelo índice filtrado exclusivo.If a conflict occurs on an article that has unique filtered indexes then conflict resolution would lead to additional deletes and inserts on the subscriber for the rows that are not covered by the unique filtered index.

Atualizações no AssinanteUpdates at the Subscriber

  • Atualizações no Assinante são propagadas para o Publicador mesmo se uma assinatura tiver expirado ou estiver inativa.Updates at the Subscriber are propagated to the Publisher even if a subscription is expired or is inactive. Assegure-se de que qualquer dessas assinaturas seja cancelada ou reinicializada.Ensure that any such subscriptions are either dropped or reinitialized.

  • Se as colunas TIMESTAMP ou IDENTITY forem usadas e replicadas como seus tipos de dados básicos, os valores nessas colunas não devem ser atualizados no Assinante.If TIMESTAMP or IDENTITY columns are used, and they are replicated as their base data types, values in these columns should not be updated at the Subscriber.

  • Assinantes não podem atualizar ou inserir valores text, ntext ou image uma vez que não é possível ler das tabelas inseridas ou excluídas dentro dos gatilhos de replicação de controle de alterações.Subscribers cannot update or insert text, ntext or image values because it is not possible to read from the inserted or deleted tables inside the replication change-tracking triggers. Da mesma forma, Assinantes não podem atualizar ou inserir valores text ou image usando WRITETEXT ou UPDATETEXT , porque os dados são substituídos pelo Publicador.Similarly, Subscribers cannot update or insert text or image values using WRITETEXT or UPDATETEXT because the data is overwritten by the Publisher. Em vez disso, é possível particionar as colunas text e image em uma tabela separada e modificar as duas tabelas na transação.Instead, you could partition the text and image columns into a separate table and modify the two tables within a transaction.

    Para atualizar objetos grandes em um assinante, use os tipos de dados varchar(max) , nvarchar(max) e varbinary(max) em vez dos tipos de dados text, ntexte image , respectivamente.To update large objects at a Subscriber, use the data types varchar(max), nvarchar(max), varbinary(max) instead of text, ntext, and image data types, respectively.

  • Atualizações em chaves exclusivas (incluindo chaves primárias) que geram duplicatas (por exemplo, uma atualização do formato UPDATE <column> SET <column> =<column>+1 ) não são permitidas e serão rejeitadas devido a uma violação de exclusividade.Updates to unique keys (including primary keys) that generate duplicates (for example, an update of the form UPDATE <column> SET <column> =<column>+1 are not allowed and will be rejected because of a uniqueness violation. Isso ocorre porque atualizações configuradas feitas no Assinante são propagadas por replicação como instruções UPDATE individuais para cada linha afetada.This is because set updates made at the Subscriber are propagated by replication as individual UPDATE statements for each row affected.

  • Se o banco de dados do Assinante for particionado horizontalmente e houver linhas na partição que existam no Assinante, mas não no Publicador, o Assinante não pode atualizar as linhas preexistentes.If the Subscriber database is partitioned horizontally and there are rows in the partition that exist at the Subscriber but not at the Publisher, the Subscriber cannot update the pre-existing rows. A tentativa de atualizar essas linhas retorna um erro.Attempting to update these rows returns an error. As linhas devem ser excluídas da tabela e inseridas novamente.The rows should be deleted from the table and inserted again.

Gatilhos definidos pelo usuárioUser-defined Triggers

  • Se o aplicativo exige gatilhos no Assinante, os gatilhos devem ser definidos com a opção NOT FOR REPLICATION no Publicador e no Assinante.If the application requires triggers at the Subscriber, the triggers should be defined with the NOT FOR REPLICATION option at the Publisher and Subscriber. Isso assegura que gatilhos sejam acionados apenas para a alteração de dados original, mas não quando aquela alteração é reproduzida.This ensures that triggers fire only for the original data change, but not when that change is replicated.

    Verifique se o gatilho definido pelo usuário não é acionado quando o gatilho de replicação atualiza a tabela.Ensure that the user-defined trigger does not fire when the replication trigger updates the table. Isso é feito usando-se o procedimento sp_check_for_sync_trigger no corpo do gatilho definido pelo usuário.This is accomplished by calling the procedure sp_check_for_sync_trigger in the body of the user-defined trigger. Para obter mais informações, veja sp_check_for_sync_trigger (Transact-SQL).For more information, see sp_check_for_sync_trigger (Transact-SQL).

Atualização imediataImmediate Updating

  • Para assinaturas de atualizações imediatas, alterações no Assinante são propagadas para o Publicador e aplicadas usando-se o MS DTC (Coordenador de Transações Distribuídas da Microsoft).For immediate updating subscriptions, changes at the Subscriber are propagated to the Publisher and applied using Microsoft Distributed Transaction Coordinator (MS DTC). Certifique-se de que o MS DTC está instalado e configurado no Publicador e no Assinante.Ensure that MS DTC is installed and configured at the Publisher and Subscriber. Para obter mais informações, consulte a documentação do Windows.For more information, see the Windows documentation.

  • Os gatilhos usados por assinaturas de atualização imediatas exigem uma conexão com o Publicador para replicar alterações.The triggers used by immediate updating subscriptions require a connection to the Publisher to replicate changes.

  • Se a publicação permitir assinaturas de atualização imediata e um artigo na publicação tiver um filtro de coluna, não é possível filtrar colunas não anuláveis sem padrões.If the publication allows immediate updating subscriptions and an article in the publication has a column filter, you cannot filter out non-nullable columns without defaults.

Atualização enfileiradaQueued Updating

  • Tabelas incluídas em uma publicação de mesclagem também não podem ser publicadas como parte de uma publicação transacional que permita assinaturas de atualização enfileirada.Tables included in a merge publication cannot also be published as part of a transactional publication that allows queued updating subscriptions.

  • Atualizações feitas para colunas de chave primária não são recomendadas quando se usa atualização enfileirada, uma vez que a chave primária é usada como um localizador de registro para todas as consultas.Updates made to primary key columns are not recommended when using queued updating because the primary key is used as a record locator for all queries. Quando a política de resolução de conflito é definida como Assinante Vence, atualizações para chaves primárias devem ser feitas com cuidado.When the conflict resolution policy is set to Subscriber Wins, updates to primary keys should be made with caution. Se atualizações para a chave primária são feitas tanto no Publicador quanto no Assinante, o resultado será duas linhas com chaves primárias diferentes.If updates to the primary key are made at both the Publisher and at the Subscriber, the result will be two rows with different primary keys.

  • Para colunas de tipo de dados SQL_VARIANT: quando os dados são inseridos ou atualizados no Assinante, eles são mapeados da seguinte forma pelo Agente de Leitor de Fila ao serem copiados do Assinante para a fila:For columns of data type SQL_VARIANT: when data is inserted or updated at the Subscriber, it is mapped in the following way by the Queue Reader Agent when it is copied from the Subscriber to the queue:

    • BIGINT, DECIMAL, NUMERIC, MONEYe SMALLMONEY são mapeados para NUMERIC.BIGINT, DECIMAL, NUMERIC, MONEY, and SMALLMONEY are mapped to NUMERIC.

    • BINARY e VARBINARY são mapeados para os dados VARBINARY .BINARY and VARBINARY are mapped to VARBINARY data.

Detecção de conflito e resoluçãoConflict Detection and Resolution

  • Para a política de conflito Assinante Vence: resolução de conflito não oferece suporte para atualizações para colunas de chave primária.For the Subscriber Wins conflict policy: conflict resolution is not supported for updates to primary key columns.

  • Conflitos devido a falhas de restrição de chave estrangeira não são resolvidos por replicação:Conflicts due to foreign key constraint failures are not resolved by replication:

    • Se conflitos não são esperados e os dados são bem particionados (Assinantes não atualizam as mesmas linhas), é possível usar restrições de chave estrangeira no Publicador e Assinante.If conflicts are not expected and data is well partitioned (Subscribers do not update the same rows), you can use foreign key constraints on the Publisher and Subscribers.

    • Se conflitos são esperados: não se deve usar restrições de chave estrangeira no Publicador ou Assinante se usar resolução de conflito "Assinante vence"; não se deve usar restrições de chave estrangeira no Assinante se você usar resolução de conflito "Publicador vence".If conflicts are expected: you should not use foreign key constraints at the Publisher or Subscriber if you use "Subscriber wins" conflict resolution; you should not use foreign key constraints at the Subscriber if you use "Publisher wins" conflict resolution.

Consulte TambémSee Also

Peer-to-Peer Transactional Replication Peer-to-Peer Transactional Replication
Replicação Transacional Transactional Replication
Publicar dados e objetos de banco de dados Publish Data and Database Objects
Assinar publicaçõesSubscribe to Publications