Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Depois que uma publicação ou assinatura é inicializada, a replicação de mesclagem rastreia e enumera todas as alterações nos dados nas tabelas publicadas. As alterações são controladas por meio de gatilhos (que a replicação cria para cada tabela publicada) e tabelas do sistema nos bancos de dados de publicação e de assinatura. Essas tabelas do sistema de replicação são preenchidas com metadados que indicam quais alterações devem ser propagadas. Quando o Merge Agent é executado durante a sincronização, as alterações são enumeradas pelo agente e aplicadas ao Publicador e ao Assinante, conforme necessário.
Controle de alterações
A replicação de mesclagem usa os seguintes gatilhos e tabelas do sistema para controlar as alterações de todas as tabelas publicadas:
MSmerge_ins_<GUID>: gatilho de inserção (o valor GUID para esse gatilho e os outros gatilhos são derivados desysmergearticles)MSmerge_upd_<GUID>: gatilho de atualização-
MSmerge_del_<GUID>: excluir gatilho MSmerge_contentsMSmerge_tombstoneMSmerge_genhistory
A replicação de mesclagem usa as seguintes tabelas extras do sistema para controlar as alterações das tabelas filtradas:
MSmerge_partition_groupsMSmerge_current_partition_mappingsMSmerge_past_partition_mappings
Observação
As tabelas do sistema listadas são utilizadas por todas as publicações e assinaturas de mesclagem em um banco de dados. Por exemplo, se você tiver mais de uma publicação em um banco de dados de publicação, MSmerge_contents incluirá linhas de artigos de todas as publicações.
Controle de alterações para tabelas não filtradas
Tabelas do sistema
As tabelas do sistema usadas para tabelas não filtradas e filtradas contêm os seguintes metadados:
MSmerge_contentscontém uma linha para cada linha inserida ou atualizada em uma tabela publicada no banco de dados.MSmerge_tombstonecontém uma linha para cada linha excluída de uma tabela publicada no banco de dados.MSmerge_genhistorycontém uma linha para cada geração. Uma geração é um conjunto de alterações que é entregue para um Publicador ou Assinante. As gerações são fechadas sempre que o Merge Agent é executado; alterações subsequentes em um banco de dados são adicionadas a uma ou mais gerações abertas.
Processo de controle de alterações
O seguinte processo de controle de alterações é usado para todas as tabelas não filtradas:
Quando uma inserção ou atualização ocorre em uma tabela publicada, o gatilho
MSmerge_ins_<GUID>ouMSmerge_upd_<GUID>dispara, e uma linha é inserida na tabela de sistemaMSmerge_contents. A colunarowguiddeMSmerge_contentscontém o GUID da linha inserida ou atualizada, indicando que na próxima vez que a sincronização ocorrer, a linha inserida ou atualizada correspondente na tabela de usuários deverá ser enviada ao Editor ou a Assinantes. Se ocorrerem atualizações subsequentes em uma linha em uma tabela de usuário, a linha emMSmerge_contentsserá atualizada para refletir esse estado.Quando ocorre uma exclusão em uma tabela publicada, o gatilho
MSmerge_del_<GUID>é acionado, e uma linha é inserida na tabela do sistemaMSmerge_tombstone. A colunarowguiddeMSmerge_tombstonecontém o GUID da linha excluída, indicando que na próxima vez que a sincronização ocorrer, uma exclusão deverá ser enviada ao Editor ou a Assinantes para a linha excluída correspondente na tabela de usuários. Se a linha excluída for referenciada emMSmerge_contents(porque foi inserida ou atualizada desde a última sincronização), a linha será excluída deMSmerge_contents.
Controle de alterações para tabelas filtradas
Tabelas do sistema
Além das tabelas do sistema descritas na seção anterior, três tabelas no banco de dados de publicação contêm metadados para controlar alterações em tabelas filtradas:
MSmerge_partition_groupscontém uma linha para cada partição definida em uma publicação. As partições podem ser:Definido explicitamente usando
sp_addmergepartitionou a página Partições de Dados da caixa de diálogo Propriedades da Publicação.Criado automaticamente quando um Assinante sincroniza, se o Assinante precisar de uma partição que ainda não possui uma entrada em
MSmerge_partition_groups.
MSmerge_current_partition_mappingscontém uma linha para cada combinação exclusiva de linhas dentroMSmerge_contentseMSmerge_partition_groups. Por exemplo, se uma linha em uma tabela de usuário pertencer a duas partições e a linha for atualizada, uma linha será inseridaMSmerge_contentspara refletir a atualização e duas linhas serão inseridasMSmerge_current_partition_mappings, para indicar que a linha atualizada pertence às duas partições.MSmerge_past_partition_mappingscontém uma linha para cada linha que não pertence mais a uma determinada partição. Uma linha sairá de uma partição se:A linha é excluída. Se uma linha for excluída de uma tabela de usuário, uma linha será inserida
MSmerge_tombstonee uma ou mais linhas serão inseridasMSmerge_past_partition_mappings.O valor em uma coluna usada para filtragem foi alterado. Por exemplo, se um filtro parametrizado for baseado no estado em que uma empresa está sediada, e a empresa mudar de sede, a linha da empresa (e linhas relacionadas em outras tabelas) poderá sair da parte dos dados de um vendedor para a parte de outro vendedor. Se uma linha for atualizada de modo que ela não pertença mais a uma partição, uma linha será inserida ou atualizada
MSmerge_contentse uma ou mais linhas serão inseridasMSmerge_past_partition_mappings.
Observação
Se partições não sobrepostas com uma assinatura por partição (um valor de 3 para o parâmetro de @partition_options sp_addmergearticle) forem usadas, as tabelas MSmerge_current_partition_mappings e MSmerge_past_partition_mappings do sistema não serão usadas para acompanhar os mapeamentos de partição das linhas, pois cada linha pertence a apenas uma partição e pode ser alterada em apenas um Assinante.
Processo de controle de alterações
O processo descrito anteriormente (na seção Controle de alterações para tabelas não filtradas) para tabelas não filtradas também é usado para tabelas filtradas, com as seguintes adições:
Quando uma inserção ocorre em uma tabela publicada, além de os dados serem atualizados ou inseridos no
MSmerge_contents, um mapeamento de partição é adicionado noMSmerge_current_partition_mappingspara cada partição à qual a linha pertence.Quando ocorre uma atualização em uma tabela publicada, além de os dados serem atualizados ou inseridos em
MSmerge_contents, se não existir um mapeamento de partição emMSmerge_current_partition_mappingspara cada partição à qual a linha pertence, um mapeamento será adicionado. Se a atualização resultou em uma linha sendo movida de uma partição para outra, uma linha será atualizadaMSmerge_current_partition_mappingse uma será adicionada aMSmerge_past_partition_mappings.Quando ocorre uma exclusão em uma tabela publicada, além de uma linha ser inserida em
MSmerge_tombstone, uma linha ser excluída deMSmerge_current_partition_mappingse uma linha ser adicionada aMSmerge_past_partition_mappings.
Alterar enumeração
Tabelas e procedimentos do sistema
Quando o Merge Agent é executado, as alterações são enumeradas usando várias tabelas do sistema e procedimentos armazenados:
MSmerge_genhistorycontém uma linha para cada geração. Uma geração é um conjunto de alterações que é entregue para um Publicador ou Assinante. As gerações são fechadas sempre que o Merge Agent é executado; alterações subsequentes em um banco de dados são adicionadas a uma ou mais gerações abertas.sysmergesubscriptionscontém informações sobre assinaturas, incluindo um registro das últimas gerações de alterações que um nó enviou e recebeu. No banco de dados de publicação, essa tabela contém uma linha para o Publicador e uma linha para cada Assinante. Em um banco de dados de assinatura, essa tabela normalmente contém uma linha para o Assinante e uma linha para o Publicador.MSmerge_generation_partition_mappingsé usado apenas para tabelas filtradas, registrando se uma determinada geração contém alterações relevantes para uma determinada partição. Esta tabela no banco de dados de publicação contém uma linha para cada combinação exclusiva de linhas emMSmerge_genhistoryeMSmerge_partition_groups.sp_MSmakegenerationfecha todas as gerações abertas no início do processo de enumeração.sp_MSenumchangesEnumera alterações para tabelas (vários procedimentos relacionados com os quais os nomes começamsp_MSenumchangestambém são usados nesse processo).sp_MSgetmetadatadetermina se uma alteração de um nó deve ser aplicada em outro nó como uma inserção, atualização ou exclusão.
Alterar o processo de enumeração
O processo a seguir ocorre durante a enumeração de mudanças:
O procedimento
sp_MSmakegenerationdo sistema é chamado:Para tabelas não filtradas e filtradas, esse procedimento fecha todas as gerações abertas referenciadas
MSmerge_genhistory(as gerações fechadas têm um valor de1ou2na colunagenstatus).Para tabelas filtradas, este procedimento preenche a tabela
MSmerge_generation_partition_mappingsdo sistema. Se uma geração contiver uma ou mais alterações relevantes para uma partição, uma linha será inserida na tabela do sistema. Se uma geração não contiver alterações relevantes para uma determinada partição, uma linha não será inserida emMSmerge_generation_partition_mappings, e as alterações não serão enumeradas para nenhum assinante que receba essa partição.
O procedimento armazenado
sp_MSenumchangese os procedimentos relacionados são chamados. Esses procedimentos enumeram as alterações que ocorreram desde a última vez em que a sincronização ocorreu:Os procedimentos primeiro determinam a geração na qual a enumeração é iniciada, com base nas colunas
sentgen(última geração enviada) erecgen(última geração recebida) na tabelasysmergesubscriptions.Por exemplo, ao determinar quais alterações de gerações devem ser enumeradas para um determinado Assinante, o
sentgendo Assinante (armazenado no banco de dados de publicação) e orecgendo Assinante (armazenado no banco de dados de assinatura) são comparados. Se os valores forem os mesmos (o que indica que a última geração enviada do Publicador foi recebida com êxito pelo Assinante), as alterações serão enumeradas a partir da próxima geração emMSmerge_genhistory. Se os valores não forem os mesmos, a parte inferior dos dois valores será usada para garantir que todas as alterações necessárias sejam enviadas.Em seguida, os procedimentos enumeram alterações:
Para tabelas não filtradas, todas as alterações contidas em gerações após a geração em
sentgenourecgensão enumeradas:MSmerge_genhistoryé unida aMSmerge_contentseMSmerge_tombstonepara determinar quais alterações devem ser enviadas.Para tabelas filtradas,
MSmerge_generation_partition_mappingsé unida a:MSmerge_current_partition_mappingseMSmerge_contents; eMSmerge_past_partition_mappingseMSmerge_tombstonepara determinar quais alterações são relevantes para a partição que o Assinante recebe.
O procedimento
sp_MSgetmetadataarmazenado é chamado para determinar se uma alteração deve ser aplicada como uma inserção, atualização ou exclusão. Neste ponto, a detecção e a resolução de conflitos são executadas; para obter mais informações, consulte Como a replicação de mesclagem detecta e resolve conflitos.
Conteúdo relacionado
- Replicação de mesclagem
- MSmerge_contents (Transact-SQL)
- MSmerge_current_partition_mappings
- MSmerge_generation_partition_mappings (Transact-SQL)
- MSmerge_genhistory (Transact-SQL)
- MSmerge_partition_groups (Transact-SQL)
- MSmerge_past_partition_mappings (Transact-SQL)
- MSmerge_tombstone (Transact-SQL)
- sp_addmergearticle (Transact-SQL)
- sp_addmergepartition (Transact-SQL)
- sysmergearticles (Transact-SQL)
- sysmergesubscriptions (Transact-SQL)
- Filtros de junção
- Filtros parametrizados – filtros de linha parametrizados