Freigeben über


Vorgehensweise: Definieren einer logischen Datensatzbeziehung zwischen Mergetabellenartikeln (Replikationsprogrammierung mit Transact-SQL)

HinweisHinweis

Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.

Mergereplikation ermöglicht Ihnen, eine Beziehung zwischen verknüpften Zeilen in verschiedenen Tabellen zu definieren. Dies bedeutet, dass Zeilen während der Synchronisierung als Transaktionseinheit verarbeitet werden können. Eine logische Datensatzbeziehung zwischen zwei Artikeln kann unabhängig davon definiert werden, ob sie über eine Verknüpfungsfilterbeziehung verfügen oder nicht. Weitere Informationen finden Sie unter Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen Datensätzen. Sie können logische Datensatzbeziehungen zwischen Artikeln programmgesteuert mithilfe gespeicherter Replikationsprozeduren angeben.

So definieren Sie eine logische Datensatzbeziehung ohne einen zugeordneten Verknüpfungsfilter

  1. Wenn die Veröffentlichung irgendwelche gefilterten Artikel enthält, führen Sie sp_helpmergepublication aus, und achten Sie im Resultset auf den Wert von use_partition_groups.

    • Wenn der Wert 1 ist, dann werden bereits vorausberechnete Partitionen verwendet.

    • Ist der in Schritt 1 ermittelte Wert 0, führen Sie sp_changemergepublication auf dem Verleger für die Veröffentlichungsdatenbank aus. Geben Sie den Wert use_partition_groups für @property und den Wert true für @value an.

      HinweisHinweis

      Wenn die Veröffentlichung keine vorausberechneten Partitionen unterstützt, dann können keine logischen Datensätze verwendet werden. Weitere Informationen finden Sie unter "Anforderungen für die Verwendung vorausberechneter Partitionen" im Thema Optimieren der Leistung parametrisierter Filter mithilfe vorausberechneter Partitionen.

    • Ist der Wert NULL, muss der Snapshot-Agent ausgeführt werden, um den Anfangssnapshot für die Veröffentlichung zu generieren.

  2. Wenn die Artikel, die den logischen Datensatz umfassen, nicht vorhanden sind, führen Sie sp_addmergearticle auf dem Verleger für die Veröffentlichungsdatenbank aus. Geben Sie eine der folgenden Konflikterkennungs- und -lösungsoptionen für den logischen Datensatz an:

    • Damit Konflikte, die innerhalb verknüpfter Zeilen im logischen Datensatz auftreten, erkannt und gelöst werden, geben Sie den Wert true für @logical_record_level_conflict_detection und @logical_record_level_conflict_resolution an.

    • Um die Standard-Konflikterkennung und -lösung auf Zeilen- oder Spaltenebene zu verwenden, geben Sie den Wert false für @logical_record_level_conflict_detection und @logical_record_level_conflict_resolution an.

  3. Wiederholen Sie Schritt 2 für jeden Artikel, der den logischen Datensatz umfasst. Sie müssen für jeden Artikel im logischen Datensatz die gleiche Konflikterkennung und Konfliktlösungsoption verwenden. Weitere Informationen finden Sie unter Ermitteln und Lösen von Konflikten in logischen Datensätzen.

  4. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergefilter aus. Geben Sie @publication an sowie den Namen des ersten an der Beziehung beteiligten Artikels für @article, den Namen des zweiten an der Beziehung beteiligten Artikels für @join_articlename, einen Namen für die Beziehung für @filtername, eine Klausel zur Definition der Beziehung zwischen den beiden Artikeln für @join_filterclause, den Verknüpfungstyp für @join_unique_key und einen der folgenden Werte für @filter_type:

    • 2 – Definiert eine logische Datensatzbeziehung.

    • 3 – Definiert eine logische Beziehung mit einem Verknüpfungsfilter.

    HinweisHinweis

    Wird kein Verknüpfungsfilter verwendet, ist die Richtung der Beziehung zwischen den beiden Artikeln nicht wichtig.

  5. Wiederholen Sie Schritt 2 für jede weitere logische Datensatzbeziehung in der Veröffentlichung.

So ändern Sie die Konflikterkennung und -lösung für logische Datensätze

  1. So erkennen und lösen Sie Konflikte, die innerhalb verknüpfter Zeilen im logischen Datensatz auftreten:

    • Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergearticle aus. Geben Sie den Wert logical_record_level_conflict_detection für @property und den Wert true für @value an. Geben Sie den Wert 1 für @force_invalidate_snapshot und @force_reinit_subscription an.

    • Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergearticle aus. Geben Sie den Wert logical_record_level_conflict_resolution für @property und den Wert true für @value an. Geben Sie den Wert 1 für @force_invalidate_snapshot und @force_reinit_subscription an.

  2. So verwenden Sie die Standard-Konflikterkennung und -lösung auf Zeilen- oder Spaltenebene:

    • Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergearticle aus. Geben Sie den Wert logical_record_level_conflict_detection für @property und den Wert false für @value an. Geben Sie den Wert 1 für @force_invalidate_snapshot und @force_reinit_subscription an.

    • Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergearticle aus. Geben Sie den Wert logical_record_level_conflict_resolution für @property und den Wert false für @value an. Geben Sie den Wert 1 für @force_invalidate_snapshot und @force_reinit_subscription an.

So entfernen Sie eine logische Datensatzbeziehung

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank die folgende Abfrage aus, um alle Informationen über die für die angegebene Veröffentlichung definierten logischen Datensatzbeziehungen zurückzugeben:

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

    Achten Sie auf den Namen der zu entfernenden logischen Datensatzbeziehung in der Spalte filtername des Resultsets.

    HinweisHinweis

    Diese Abfrage gibt die gleichen Informationen zurück wie sp_helpmergefilter. Diese gespeicherte Systemprozedur ermittelt jedoch nur Informationen über logische Datensatzbeziehungen, die auch Verknüpfungsfilter sind.

  2. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_dropmergefilter aus. Geben Sie @publication an sowie den Namen eines der an der Beziehung beteiligten Artikel für @article und den Namen der Beziehung aus Schritt 1 für @filtername.

Beispiel

Im folgenden Beispiel werden vorausberechnete Partitionen für eine vorhandene Veröffentlichung aktiviert und es wird ein logischer Datensatz erstellt, der die zwei neuen Artikel für die Tabellen SalesOrderHeader und SalesOrderDetail umfasst.

-- 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