Como definir uma relação de registro lógico entre artigos da tabela de mesclagem (Programação Transact-SQL de replicação)
Observaçã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
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çã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.
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.
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.
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çã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.
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
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.
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.
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çã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.
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