Udostępnij za pośrednictwem


Jak Zdefiniuj relację rekordu logiczne między artykuły tabeli korespondencji seryjnej (Programowanie replikacji Transact-SQL)

Ostrzeżenie

Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.

Replikacja scalania pozwala zdefiniować relację między powiązane wiersze w różnych tabelach.Oznacza to, że wiersze mogą być przetwarzane jako jednostkę transakcyjną podczas synchronizacji.rekord logiczny mogą być definiowane między dwóch artykułach, czy mają one filtr łączyć relacji.Aby uzyskać więcej informacji, zobacz Zmiany do wierszy powiązanych z rekordami logiczne grupowanie.Można programowo określić rekord logiczny relacji między artykułów procedur przechowywanych replikacja.

Aby zdefiniować rekord logiczny relacji bez filtru skojarzone łączyć

  1. Jeśli publikacja zawiera wszystkie artykuły, które są filtrowane, wykonywał sp_helpmergepublicationi zanotuj wartość use_partition_groups w zestaw wyników.

    • Jeśli wartość jest 1, wstępnie obliczone partycje są już używane.

    • Jeśli wartość jest 0, następnie wykonać sp_changemergepublication Wydawca na baza danych publikacja.Określ wartość use_partition_groups dla @ Właściwość i wartości true dla wartość @.

      Ostrzeżenie

      Jeśli publikacja nie obsługuje partycji precomputed, nie można użyć rekordów logicznych.Aby uzyskać więcej informacji, zobacz wymagania dotyczące partycji przy użyciu wstępnie obliczone w temacie Optymalizacja sparametryzowana wydajności filtr partycji Precomputed.

    • Jeśli wartością jest NULL, a następnie Agent migawki musi być uruchomione do generowania migawka początkowa w publikacja.

  2. Jeśli artykułów, składających rekord logiczny nie istnieje, wykonać sp_addmergearticle Wydawca na baza danych publikacja.Określ jeden z następujących konflikt wykrywania i rozpoznawania opcji rekord logiczny:

    • Aby wykrywać i rozwiązywać konflikty, występujących w powiązane wiersze w rekordzie logiki, określ wartość true dla @ logical_record_level_conflict_detection i @ logical_record_level_conflict_resolution.

    • Aby użyć standardowych wierszy - lub kolumna-poziom wykrywanie konfliktów i rozdzielczości, określ wartość false dla @ logical_record_level_conflict_detection i @ logical_record_level_conflict_resolution, co jest ustawieniem domyślnym.

  3. Powtórz krok 2 dla każdego artykuł, stanowiące rekord logiczny.Należy użyć tej samej opcji wykrywania i rozwiązywania konfliktów dla każdego artykuł w rekord logiczny.Aby uzyskać więcej informacji, zobacz Wykrywanie i rozwiązywania konfliktów w rekordach logicznych.

  4. W programie publisher na baza danych publikacja, wykonanie sp_addmergefilter.Określ publikacja @, nazwa jeden artykuł w relacji do @ artykułu, Nazwa drugiego artykułu @ join_articlename, nazwę relacji dla @ NazwaFiltru, klauzula, która definiuje relację między dwoma artykuły dla @ join_filterclause, typu łączyć dla @ join_unique_key i jedną z następujących wartości @ filter_type:

    • 2 -Określa logiczną relacją.

    • 3 -Określa logiczną relacją z filtr łączyć.

    Ostrzeżenie

    Jeśli filtr łączyć jest nieużywany, kierunek relacji między dwoma artykułów nie jest ważna.

  5. Powtórz krok 2 dla każdej pozostałej relacji rekord logiczny w publikacja.

Aby zmienić wykrywanie konfliktów i rozpoznawanie rekordów logicznych

  1. Aby wykrywać i rozwiązywać konflikty, występujących w powiązane wiersze w rekord logiczny:

    • Wydawca na baza danych publikacja, wykonanie sp_changemergearticle.Określ wartość logical_record_level_conflict_detection dla @ Właściwość i wartości true dla wartość @.Określ wartość 1 dla @ force_invalidate_snapshot i @ force_reinit_subscription.

    • Wydawca na baza danych publikacja, wykonanie sp_changemergearticle.Określ wartość logical_record_level_conflict_resolution dla @ Właściwość i wartości true dla wartość @.Określ wartość 1 dla @ force_invalidate_snapshot i @ force_reinit_subscription.

  2. Aby użyć standardowego poziomu wierszy lub kolumna-poziom wykrywanie konfliktów i rozdzielczość:

    • Wydawca na baza danych publikacja, wykonanie sp_changemergearticle.Określ wartość logical_record_level_conflict_detection dla @ Właściwość i wartości false dla wartość @.Określ wartość 1 dla @ force_invalidate_snapshot i @ force_reinit_subscription.

    • Wydawca na baza danych publikacja, wykonanie sp_changemergearticle.Określ wartość logical_record_level_conflict_resolution dla @ Właściwość i wartości false dla wartość @.Określ wartość 1 dla @ force_invalidate_snapshot i @ force_reinit_subscription.

Aby usunąć relacji rekord logiczny

  1. Wydawca na baza danych publikacja, następujące kwerenda zwraca informacje o wszystkich relacji rekord logiczny zdefiniowanych dla określonej publikacja:

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

    Zanotuj nazwę relacji rekord logiczny usuwana w filtername kolumny w zestaw wyników.

    Ostrzeżenie

    Ta kwerenda zwraca te same informacje, jak sp_helpmergefilter; Jednak to systemowa procedura składowana tylko zwraca informacje o relacji rekord logiczny, które są również filtry łączyć.

  2. Wydawca na baza danych publikacja, wykonanie sp_dropmergefilter.Określ publikacja @, nazwa artykuły w relacji do @ artykułoraz nazwę relacji z kroku 1 dla @ NazwaFiltru.

Przykład

Ten przykład włącza partycje precomputed dla istniejącej publikacja i tworzy rekord logiczny, obejmujący dwa nowe artykuły dla tabel SalesOrderHeader i 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.BusinessEntityID = 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