Compartilhar via


Como definir uma relação de registro lógico entre artigos da tabela de mesclagem (Programação Transact-SQL de replicação)

ObservaçãoObservação

Esse recurso será removido em uma versão futura do Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.

A replicação de mesclagem permite definir uma relação entre linhas relacionadas em tabelas diferentes. Isso significa que as linhas podem ser processadas como unidade transacional durante a sincronização. Um registro lógico pode ser definido entre dois artigos tenham eles ou não uma relação de filtro de junção. Para obter mais informações, consulte Agrupando alterações a linhas relacionadas com registros lógicos. É possível especificar relações de registro lógico de forma programática entre artigos que usem procedimentos armazenados de replicação.

Para definir uma relação de registro lógico sem filtro de junção associado

  1. Se a publicação contiver quaisquer artigos filtrados, execute sp_helpmergepublication, e observe o valor de use_partition_groups no conjunto de resultados.

    • Se o valor for 1, partições pré-computadas já estarão sendo usadas.

    • Se o valor for 0, execute sp_changemergepublication ao Publicador do banco de dados de publicação. Especifique um valor de use_partition_groups para @property e um valor de true para @value.

      ObservaçãoObservação

      Se a publicação não oferecer suporte a partições pré-computadas, os registros lógicos não poderão ser usados. Para obter mais informações, consulte Requisitos para usar partições pré-computadas, no tópico Otimizando o desempenho de filtro com parâmetros com partições pré-computadas.

    • Se o valor for NULL, será necessário executar o Snapshot Agent para gerar o instantâneo inicial para a publicação.

  2. Se os artigos que integrarem o registro lógico não existirem, execute sp_addmergearticle no Publicador do banco de dados de publicação. Especifique uma das opções de detecção e resolução de conflitos para o registro lógico:

    • Para detectar e resolver conflitos que ocorrem dentro das linhas relacionadas no registro lógico, especifique um valor de true para @logical_record_level_conflict_detection e @logical_record_level_conflict_resolution.

    • Para usar a detecção e resolução de conflitos padrão de linha ou coluna, especifique o valor de false para @logical_record_level_conflict_detection e @logical_record_level_conflict_resolution, que é o padrão.

  3. Repita a Etapa 2 para cada artigo que integrará o registro lógico. É preciso usar a mesma opção de detecção e resolução de conflitos para cada artigo no registro lógico. Para obter mais informações, consulte Detectando e resolvendo conflitos em registros lógicos.

  4. No Publicador do banco de dados de publicação, execute sp_addmergefilter. Especifique @publication; o nome do artigo na relação para @article; o nome do segundo artigo para @join_articlename; o nome da relação para @filtername; a cláusula que define a relação entre os dois artigos para @join_filterclause; o tipo de junção para @join_unique_key e um dos valores a seguir para @filter_type:

    • 2 - Define uma relação lógica.

    • 3 - Define uma relação lógica com um filtro de junção.

    ObservaçãoObservação

    Se um filtro de junção não for usado, a direção da relação entre os dois artigos não será importante.

  5. Repita a Etapa 2 para cada relação de registro lógico remanescente na publicação.

Para alterar a detecção e resolução de conflito para registros lógicos

  1. Para detectar e resolver conflitos que ocorrem dentro de linhas relacionadas no registro lógico:

    • No Publicador do banco de dados de publicação, execute sp_changemergearticle. Especifique um valor de logical_record_level_conflict_detection para @property, e um valor de true para @value. Especifique um valor de 1 para @force_invalidate_snapshot e @force_reinit_subscription.

    • No Publicador do banco de dados de publicação, execute sp_changemergearticle. Especifique um valor de logical_record_level_conflict_resolution para @property, e um valor de true para @value. Especifique um valor de 1 para @force_invalidate_snapshot e @force_reinit_subscription.

  2. Para usar a detecção e resolução de conflitos padrão em nível de linha ou coluna:

    • No Publicador do banco de dados de publicação, execute sp_changemergearticle. Especifique um valor de logical_record_level_conflict_detection para @property, e um valor de true para @value. Especifique um valor de 1 para @force_invalidate_snapshot e @force_reinit_subscription.

    • No Publicador do banco de dados de publicação, execute sp_changemergearticle. Especifique um valor de logical_record_level_conflict_resolution para @property, e um valor de false para @value. Especifique um valor de 1 para @force_invalidate_snapshot e @force_reinit_subscription.

Para remover uma relação de registro lógico.

  1. No Publicador do banco de dados de publicação, execute a consulta a seguir para retornar informações sobre todos as relações de registro lógicos definidos para a publicação especificada:

    SELECT f.* FROM sysmergesubsetfilters AS f 
    INNER JOIN sysmergepublications AS p
    ON f.pubid = p.pubid WHERE p.[name] = @publication;
    

    Anote o nome da relação de registro lógico sendo removido da coluna filtername no conjunto de resultados.

    ObservaçãoObservação

    Essa consulta retorna as mesmas informações de sp_helpmergefilter; no entanto, esse procedimento armazenado de sistema retorna apenas informações sobre relações de registro lógico que são também filtros de junção.

  2. No Publicador do banco de dados de publicação, execute sp_dropmergefilter. Especifique @publication, o nome de um dos artigos da relação para @article, e o nome da relação da Etapa 1 para @filtername.

Exemplo

Esse exemplo ativa partições pré-computadas em uma publicação existente, e cria um registro lógico que inclui os dois novos artigos para as tabelas SalesOrderHeader e SalesOrderDetail.

-- Remove ON DELETE CASCADE from FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID;
-- logical records cannot be used with ON DELETE CASCADE. 
IF EXISTS (SELECT * FROM sys.objects 
WHERE name = 'FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID')
BEGIN
    ALTER TABLE [Sales].[SalesOrderDetail] 
    DROP CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID] 
END

ALTER TABLE [Sales].[SalesOrderDetail]  
WITH CHECK ADD CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID] 
FOREIGN KEY([SalesOrderID])
REFERENCES [Sales].[SalesOrderHeader] ([SalesOrderID])
GO

DECLARE @publication    AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
DECLARE @partitionoption AS bit;
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'SalesOrderDetail'; 
SET @table2 = N'SalesOrderHeader'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- Ensure that the publication uses precomputed partitions.
SET @partitionoption = (SELECT [use_partition_groups] FROM sysmergepublications 
    WHERE [name] = @publication);
IF @partitionoption <> 1
BEGIN
    EXEC sp_changemergepublication 
        @publication = @publication, 
        @property = N'use_partition_groups', 
        @value = 'true',
        @force_invalidate_snapshot = 1;
END  

-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_object = @table1, 
  @type = N'table', 
  @source_owner = @hrschema,
  @schema_option = 0x0004CF1,
  @description = N'article for the Employee table',
  @subset_filterclause = @filterclause;

-- Add an article for the SalesOrderHeader table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema,
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderHeader table';

-- Add an article for the SalesOrderDetail table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderDetail table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80;

-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table2, 
  @filtername = N'SalesOrderHeader_Employee', 
  @join_articlename = @table1, 
  @join_filterclause = N'Employee.EmployeeID = SalesOrderHeader.SalesPersonID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Create a logical record relationship that is also a merge join 
-- filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'LogicalRecord_SalesOrderHeader_SalesOrderDetail', 
  @join_articlename = @table2, 
  @join_filterclause = N'[SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]', 
  @join_unique_key = 1, 
  @filter_type = 3, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO