Agrupar alterações a linhas relacionadas com registros lógicosGroup Changes to Related Rows with Logical Records

Este tópico aplica-se a: Simdo SQL Serversembanco de dados do SQL AzuresemAzure SQL Data Warehouse sem Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Observação

Esse recurso será removido em uma versão futura do Microsoft SQL Server.This feature will 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.

Por padrão, os dados de processos de replicação de mesclagem são alterados em uma base de linha por linha.By default, merge replication processes data changes on a row-by-row basis. Em muitas circunstâncias isto é apropriado, mas para alguns aplicativos, é essencial que as linhas relacionadas sejam processadas como uma unidade.In many circumstances this is appropriate, but for some applications, it is essential that related rows be processed as a unit. O recurso de registro lógico de replicação de mesclagem permite que você defina uma relação entre linhas relacionadas em diferentes tabelas para que as linhas sejam processadas como uma unidade.The logical records feature of merge replication allows you to define a relationship between related rows in different tables so that the rows are processed as a unit.

Observação

O recurso de registros lógicos pode ser usado só ou junto com filtros de junção.The logical records feature can be used alone or in conjunction with join filters. Para obter mais informações sobre filtros de junção, consulte Join Filters.For more information about join filters, see Join Filters. Para usar registros lógicos, o nível de compatibilidade da publicação deve ser pelo menos 90RTM.To use logical records, the compatibility level of the publication must be at least 90RTM.

Considere estas três tabelas relacionadas:Consider these three related tables:

Três registros lógicos de tabela, apenas com nomes de colunaThree table logical record, with column names only

A tabela Customers é a tabela pai nesta relação e tem uma coluna de chave primária CustID.The Customers table is the parent table in this relationship and has a primary key column CustID. A tabela Orders tem uma coluna de chave primária OrderID, com uma restrição de chave estrangeira na coluna CustID que faz referência à coluna CustID na tabela Customers .The Orders table has a primary key column OrderID, with a foreign key constraint on the CustID column that references the CustID column in the Customers table. De forma semelhante, a tabela OrderItems tem uma coluna de chave primária OrderItemID, com uma restrição de chave estrangeira na coluna OrderID que faz referência à coluna OrderID na tabela Orders .Similarly, the OrderItems table has a primary key column OrderItemID, with a foreign key constraint on the OrderID column that references the OrderID column in the Orders table.

Neste exemplo, um registro lógico consiste de todas as linhas na tabela Orders que são relacionadas a um valor CustID único e todas as linhas na tabela OrderItems são relacionadas a aquelas linhas na tabela Orders .In this example, a logical record consists of all the rows in the Orders table that are related to a single CustID value and all of the rows in the OrderItems table that are related to those rows in the Orders table. Este diagrama exibe todas as linhas nas três tabelas que estão no registro lógico para Customer2:This diagram shows all the rows in the three tables that are in the logical record for Customer2:

Três registros lógicos de tabela com valoresThree table logical record with values

Definir uma relação de registro lógico entre artigos, consulte Define a Logical Record Relationship Between Merge Table Articles.To define a logical record relationship between articles, see Define a Logical Record Relationship Between Merge Table Articles.

Benefícios de registros lógicosBenefits of Logical Records

O recurso de registros lógicos tem dois benefícios primários:The logical records feature has two primary benefits:

  • Aplicação de alterações de dados como uma unidade.Application of data changes as a unit.

  • A detecção e resolução de conflitos simultaneamente em várias linhas de várias tabelas.The detection and resolution of conflicts simultaneously on multiple rows from multiple tables.

A aplicação de alterações como uma unidadeThe Application of Changes As a Unit

Se o processamento de mesclagem for interrompido, como no caso de uma conexão descartada, o conjunto parcialmente completado de alterações replicadas relacionadas será revertido se forem usados registros lógicos.If merge processing is interrupted, such as in the case of a dropped connection, the partially completed set of related replicated changes is rolled back if logical records are used. Por exemplo, considere o caso onde um Assinante adiciona um novo pedido com OrderID = 6 e duas novas linhas na tabela OrderItems com OrderItemID = 10 e OrderItemID = 11 para OrderID = 6.For example, consider the case where a Subscriber adds a new order with OrderID = 6 and two new rows in the OrderItems table with OrderItemID = 10 and OrderItemID = 11 for OrderID = 6.

Três registros lógicos de tabela com valoresThree table logical record with values

Se o processo de replicação for interrompido depois da linha Pedidos , para OrderID = 6 está concluído, mas, antes que os OrderItems 10 e 11 sejam concluídos e os registros lógicos não sejam usados, o valor de OrderTotal para OrderID = 6 não será consistente com a soma dos valores OrderAmount das linhas OrderItems .If the replication process is interrupted after the Orders row for OrderID = 6 is complete, but before the OrderItems 10 and 11 are completed, and logical records are not used, the OrderTotal value for OrderID = 6 will not be consistent with the sum of the OrderAmount values for the OrderItems rows. Se forem usados registros lógicos, a linha Orders para OrderID = 6 não será confirmada até que as alterações OrderItems sejam replicadas.If logical records are used, the Orders row for OrderID = 6 is not committed until the related OrderItems changes are replicated.

Em um cenário diferente, se forem usados registros lógicos e alguém estiver consultando tabelas quando o processo de mesclagem estiver aplicando alterações, o usuário não verá alterações replicadas parcialmente até que todas elas sejam concluídas.In a different scenario, if logical records are used, and someone is querying tables when the merge process is applying changes, the user will not see the partially replicated changes until they are all complete. Por exemplo, se o processo de replicação tiver carregado a linha de Pedidos para OrderID = 6, mas um usuário consultar as tabelas antes que o processo de replicação tenha replicado as linhas de OrderItems , o valor de OrderTotal não será o mesmo da soma dos valores de OrderAmount .For example, the replication process has uploaded the Orders row for OrderID = 6, but a user queries the tables before the replication process has replicated the OrderItems rows, the OrderTotal value would not be the same as the sum of the OrderAmount values. Se forem usados registros lógicos, a linha de Pedidos não será visível ate que as linhas de OrderItems sejam concluídas e a transação seja confirmada como uma unidade.If logical records are used, the Orders row would not be visible until the OrderItems rows are complete and the transaction has been committed as a unit.

A aplicação de manipulação de conflito para mais do que uma tabelaThe Application of Conflict Handling to More Than One Table

Considere o caso e quem dois Assinantes têm os dados acima definidos:Consider the case where two Subscribers have the data set above:

  • Um usuário no primeiro Assinante altera o OrderAmount do OrderItemID 5 de 100 para 150 e o OrderTotal do OrderID 3 de 200 para 250.A user at the first Subscriber changes the OrderAmount of OrderItemID 5 from 100 to 150 and the OrderTotal of OrderID 3 from 200 to 250.

  • Um usuário no segundo Assinante altera o OrderAmount do OrderItemID 6 de 25 para 125 e o OrderTotal do OrderID 3 de 200 para 300.A user at the second Subscriber changes the OrderAmount of OrderItemID 6 from 25 to 125 and the OrderTotal of OrderID 3 from 200 to 300.

    Se essas alterações forem replicadas sem usar registros lógicos, os valores diferentes de OrderTotal resultarão em um conflito e apenas um deles será replicado.If these changes are replicated without using logical records, the different OrderTotal values would result in a conflict and only one of them would be replicated. Mas as alterações não conflitantes na tabela OrderItems serão replicadas sem conflito, deixando os valores finais OrderTotal em um estado inconsistente em relação às linhas OrderItems .But the non-conflicting changes in the OrderItems table would be replicated without conflict, leaving the final OrderTotal values in an inconsistent state with respect to the OrderItems rows. Se forem usados registros lógicos neste cenário, a alteração de OrderItems associada com a alteração perdida da tabela Orders será revertida e o valor final de OrderTotal será um resumo preciso das linhas de OrderItems .If logical records are used in this scenario, the OrderItems change associated with the losing Orders table change would also be rolled back, and the final OrderTotal value would be an accurate summary of the OrderItems rows.

    Para mais informações sobre as opções relacionadas à detecção e à resolução de conflitos com registros lógicos, consulte Detectando e resolvendo conflitos em registros lógicos.For more information about options related to conflict detection and resolution with logical records, see Detecting and Resolving Conflicts in Logical Records.

Considerações para usar registros lógicosConsiderations for Using Logical Records

Lembre-se das seguintes considerações ao usar registros lógicos:Keep the following considerations in mind when using logical records.

Considerações geraisGeneral Considerations

  • É recomendável que você mantenha o número de tabelas em um registro lógico o mais baixo possível; cinco tabelas ou menos é o recomendável.It is recommended that you keep the number of tables in a logical record as low as possible; five tables or less is recommended.

  • Registros lógicos não podem fazer referência a colunas com quaisquer dos tipos de dados seguintes:Logical records cannot reference columns with any of the following data types:

    • varchar(max) e nvarchar(max)varchar(max) and nvarchar(max)

    • varbinary(max)varbinary(max)

    • text e ntexttext and ntext

    • imageimage

    • XMLXML

    • UDTUDT

  • Não podem ser definidas relações de chave estrangeira em tabelas publicadas com a opção CASCADE.Foreign key relationships in published tables cannot be defined with the CASCADE option. Para mais informações, consulte CREATE TABLE (Transact-SQL) e ALTER TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL) and ALTER TABLE (Transact-SQL).

  • Você não pode atualizar qualquer coluna que é usada na cláusula de relação lógica.You cannot update any columns that are used in the logical relation clause.

  • A resolução de conflitos personalizada com manipuladores de lógica de negócios ou resolvedores personalizados não tem suporte para artigos que não são incluídos em um registro lógico.Custom conflict resolution with business logic handlers or custom resolvers is not supported for articles that are included in a logical record.

  • Se registros lógicos forem usados em uma publicação que inclui filtros com parâmetros, você deverá inicializar cada Assinante com um instantâneo de sua partição.If logical records are used in a publication that includes parameterized filters, you must initialize each Subscriber with a snapshot for its partition. Se você inicializar um Assinante com outro método, o Merge Agent falhará.If you initialize a Subscriber with another method, the Merge Agent will fail. Para obter mais informações, consulte Snapshots for Merge Publications with Parameterized Filters.For more information, see Snapshots for Merge Publications with Parameterized Filters.

  • Não são exibidos conflitos que envolvem registros lógicos no Visualizador de Conflitos.Conflicts that involve logical records are not displayed in Conflict Viewer. Para exibir informações sobre esses conflitos, use procedimentos armazenados de replicação.To view information about these conflicts, use replication stored procedures. Para obter mais informações, consulte Exibir informações sobre conflitos em publicações de mesclagem (Programação Transact-SQL de replicação).For more information, see View Conflict Information for Merge Publications (Replication Transact-SQL Programming).

Configurações de PublicaçãoPublication Settings

  • A publicação deve ter um nível de compatibilidade de 90RTM ou maior.The publication must have a compatibility level of 90RTM or greater. Para mais informações, consulte a seção "Nível de Compatibilidade para publicações” em Compatibilidade com a replicação.For more information, see the "Publication Compatibility Level" section of Replication Backward Compatibility.

  • A publicação deve usar modo de instantâneo nativo.The publication must use native snapshot mode. Este é o padrão a menos que você esteja replicando para SQL Server CompactSQL Server Compact, que não oferece suporte a registros lógicos.This is the default unless you are replicating to SQL Server CompactSQL Server Compact, which does not support logical records.

  • A publicação não pode permitir sincronização da Web.The publication cannot allow Web synchronization. Para obter mais informações sobre a sincronização da Web, consulte Web Synchronization for Merge Replication.For more information about Web synchronization, see Web Synchronization for Merge Replication.

  • Para usar registros lógicos em uma publicação filtrada:In order to use logical records on a filtered publication:

  • Se a publicação usar filtros de junções, a propriedade juntar chave exclusiva deverá ser definida como verdadeiro para todos os filtros de junção que são envolvidos em relações de registro lógico.If the publication uses join filters, the join unique key property must be set to true for all join filters that are involved in logical record relationships. Para obter mais informações, consulte Join Filters.For more information, see Join Filters.

Relações entre tabelasRelationships Between Tables

  • Tabelas relacionadas por registros lógicos devem ter uma relação chave primária-chave estrangeira.Tables related through logical records must have a primary key-foreign key relationship.

  • A opção NOT FOR REPLICATION não pode ser definida para restrições de chave estrangeira.The NOT FOR REPLICATION option cannot be set for foreign key constraints.

  • Tabelas filho podem ter só uma tabela pai.Child tables can have only one parent table.

    Por exemplo, um banco de dados que rastreia classes e estudantes poderá ter um design semelhante a:For example, a database tracking classes and students might have a design similar to:

    Tabela filho com mais de uma tabela paiChild table with more than one parent table

    Você não pode usar um registro lógico para representar as três tabelas nessa relação, porque as linhas em ClassMembers não são associadas com uma linha de chave primária única.You cannot use a logical record to represent the three tables in this relationship, because the rows in ClassMembers are not associated with a single primary key row. As tabelas Classes e ClassMembers poderiam ainda formar um registro lógico, como poderiam as tabelas ClassMembers e Students, mas não todas as três.The tables Classes and ClassMembers could still form a logical record, as could the tables ClassMembers and Students, but not all three.

  • A publicação não pode conter relações de filtro de junção circulares.The publication cannot contain circular join filter relationships.

    Usando o exemplo com as tabelas Customers, Orderse OrderItems, você não poderia usar registros lógicos se a tabela Orders também tivesse uma restrição de chave estrangeira que fez referência à tabela OrderItems .Using the example with the tables Customers, Orders, and OrderItems, you could not use logical records if the Orders table also had a foreign key constraint that referenced the OrderItems table.

Implicações de desempenho de registros lógicosPerformance implications of logical records

O recurso de registro lógico vem com um custo de desempenho.The logical record feature does come with a performance cost. Se não forem usados registros lógicos, o agente de replicação poderá processar todas as alterações para um determinado artigo ao mesmo tempo, e como as alterações são aplicadas no modo linha por linha, os requisitos de bloqueio e log de transação, necessários para aplicar as alterações, serão mínimos.If logical records are not used, the replication agent can process all of the changes for a given article at the same time, and because the changes are applied in a row-by-row fashion, the locking and transaction log requirements necessary for applying the changes are minimal.

Se registros lógicos forem usados, o Merge Agent deverá processar as alterações para cada registro lógico inteiro, de forma conjunta.If logical records are used, the Merge Agent must process the changes for each entire logical record together. Isto tem um efeito no tempo necessário para o Merge Agent replicar as linhas.This has an effect on the amount of time it takes the Merge Agent to replicate the rows. Adicionalmente, como o agente abre uma transação separada para cada registro lógico, os requisitos de bloqueio podem aumentar.Additionally, because the agent opens a separate transaction for each logical record, locking requirements can increase.

Consulte tambémSee Also

Article Options for Merge ReplicationArticle Options for Merge Replication