Tentukan Hubungan Rekaman Logis Antara Artikel Tabel Gabungan

Berlaku untuk:SQL Server

Topik ini menjelaskan cara menentukan hubungan rekaman logis antara artikel tabel gabungan di SQL Server dengan menggunakan SQL Server Management Studio, Transact-SQL, atau Objek Manajemen Replikasi (RMO).

Menggabungkan replikasi memungkinkan Anda menentukan hubungan antara baris terkait dalam tabel yang berbeda. Baris ini kemudian dapat diproses sebagai unit transaksional selama sinkronisasi. Catatan logis dapat didefinisikan di antara dua artikel apakah mereka memiliki hubungan filter gabungan atau tidak. Untuk informasi selengkapnya, lihat Perubahan Grup pada Baris Terkait dengan Rekaman Logis.

Catatan

Fitur ini akan dihapus dalam versi SQL Server yang akan datang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini.

Dalam Topik Ini

Sebelum Anda mulai

Batasan dan Pembatasan

  • Jika Anda menambahkan, mengubah, atau menghapus catatan logis setelah langganan ke publikasi telah diinisialisasi, Anda harus membuat rekam jepret baru dan menginisialisasi ulang semua langganan setelah melakukan perubahan. Untuk informasi selengkapnya tentang persyaratan perubahan properti, lihat Mengubah Publikasi dan Properti Artikel.

Menggunakan SQL Server Management Studio

Tentukan rekaman logis dalam kotak dialog Tambahkan Gabungan , yang tersedia di Panduan Publikasi Baru dan kotak dialog Properti Publikasi - <Publikasi> . Untuk informasi selengkapnya tentang menggunakan panduan dan mengakses kotak dialog, lihat Membuat Publikasi dan Menampilkan dan Mengubah Properti Publikasi.

Rekaman logis dapat ditentukan dalam kotak dialog Tambahkan Gabungan hanya jika diterapkan ke filter gabungan dalam publikasi gabungan, dan publikasi mengikuti persyaratan untuk menggunakan partisi yang telah dikompilasi sebelumnya. Untuk menentukan rekaman logis yang tidak diterapkan untuk menggabungkan filter dan untuk mengatur deteksi konflik dan resolusi pada tingkat rekaman logis, Anda harus menggunakan prosedur tersimpan.

Untuk menentukan hubungan rekaman logis

  1. Pada halaman Filter Baris Tabel dari Panduan Publikasi Baru atau halaman Filter Baris dari kotak dialog Properti Publikasi - <Publikasi>, pilih filter baris di panel Tabel Yang Difilter.

    Hubungan rekaman logis dikaitkan dengan filter gabungan, yang memperluas filter baris. Oleh karena itu, Anda harus menentukan filter baris sebelum dapat memperluas filter dengan gabungan dan menerapkan hubungan rekaman logis. Setelah satu filter gabungan ditentukan, Anda dapat memperluas filter gabungan ini dengan filter gabungan lain. Untuk informasi selengkapnya tentang menentukan filter gabungan, lihat Menentukan dan Mengubah Filter Gabungan Antara Artikel Gabungan.

  2. Klik Tambahkan, lalu klik Tambahkan Gabungan untuk Memperluas Filter yang Dipilih.

  3. Tentukan filter gabungan dalam kotak dialog Tambahkan Gabungan , lalu pilih kotak centang Catatan Logis.

  4. Jika Anda berada dalam kotak dialog Properti Publikasi - <Publikasi> , klik OK untuk menyimpan dan menutup kotak dialog.

Untuk menghapus hubungan rekaman logis

  • Hapus hanya hubungan rekaman logis atau hapus hubungan rekaman logis dan filter gabungan yang terkait dengannya.

    Untuk menghapus hanya hubungan rekaman logis:

    1. Pada halaman Filter Baris dari Panduan Publikasi Baru atau halaman Filter Baris dari kotak dialog Properti Publikasi - <Publikasi>, pilih filter gabungan yang terkait dengan hubungan rekaman logis di panel Tabel Yang Difilter, lalu klik Edit.

    2. Dalam kotak dialog Edit Gabung , kosongkan kotak centang Catatan Logis.

    3. Pilih OK.

    Untuk menghapus hubungan rekaman logis dan menggabungkan filter yang terkait dengannya:

    • Pada halaman Filter Baris dari kotak dialog Panduan Publikasi Baru atau Properti Publikasi - <Publikasi> , pilih filter di panel Tabel Yang Difilter, lalu klik Hapus. Jika filter gabungan yang Anda hapus sendiri diperluas oleh gabungan lain, gabungan tersebut juga akan dihapus.

Menggunakan T-SQL

Anda dapat menentukan hubungan rekaman logis secara terprogram antara artikel menggunakan prosedur tersimpan replikasi.

Untuk menentukan hubungan rekaman logis tanpa filter gabungan terkait

  1. Jika publikasi berisi artikel apa pun yang difilter, jalankan sp_helpmergepublication, dan perhatikan nilai use_partition_groups dalam tataan hasil.

    • Jika nilainya adalah 1, maka partisi yang telah dikomputasi sudah digunakan.

    • Jika nilainya adalah 0, jalankan sp_changemergepublication di Publisher pada database publikasi. Tentukan nilai use_partition_groups untuk @property dan nilai true untuk @value.

      Catatan

      Jika publikasi tidak mendukung partisi yang telah dikomputasi sebelumnya, rekaman logis tidak dapat digunakan. Untuk informasi selengkapnya, lihat Persyaratan untuk Menggunakan Partisi yang Telah Dikomputasi dalam topik Optimalkan Performa Filter Berparameter dengan Partisi yang Telah Dikomputasi.

    • Jika nilainya NULL, maka Agen Rekam Jepret perlu dijalankan untuk menghasilkan rekam jepret awal untuk publikasi.

  2. Jika artikel yang akan terdiri dari catatan logis tidak ada, jalankan sp_addmergearticle di Publisher pada database publikasi. Tentukan salah satu opsi deteksi konflik dan resolusi berikut untuk rekaman logis:

    • Untuk mendeteksi dan mengatasi konflik yang terjadi dalam baris terkait dalam catatan logika, tentukan nilai true untuk @logical_record_level_conflict_detection dan @logical_record_level_conflict_resolution.

    • Untuk menggunakan deteksi dan resolusi konflik tingkat baris atau kolom standar, tentukan nilai false untuk @logical_record_level_conflict_detection dan @logical_record_level_conflict_resolution, yang merupakan default.

  3. Ulangi langkah 2 untuk setiap artikel yang akan terdiri dari catatan logis. Anda harus menggunakan opsi deteksi dan resolusi konflik yang sama untuk setiap artikel dalam catatan logis. Untuk informasi selengkapnya, lihat Mendeteksi dan Mengatasi Konflik dalam Rekaman Logis.

  4. Di penerbit pada database publikasi, jalankan sp_addmergefilter. Tentukan @publication, nama satu artikel dalam hubungan untuk @article, nama artikel kedua untuk @join_articlename, nama untuk hubungan untuk @filtername, klausa yang menentukan hubungan antara dua artikel untuk @join_filterclause, jenis gabungan untuk @join_unique_key dan salah satu nilai berikut untuk @filter_type:

    • 2 - Mendefinisikan hubungan logis.

    • 3 - Menentukan hubungan logis dengan filter gabungan.

    Catatan

    Jika filter gabungan tidak digunakan, arah hubungan antara kedua artikel tidak penting.

  5. Ulangi langkah 2 untuk setiap hubungan rekaman logis yang tersisa dalam publikasi.

Untuk mengubah deteksi konflik dan resolusi untuk rekaman logis

  1. Untuk mendeteksi dan mengatasi konflik yang terjadi dalam baris terkait dalam catatan logis:

    • Di Publisher pada database publikasi, jalankan sp_changemergearticle. Tentukan nilai logical_record_level_conflict_detection untuk @property dan nilai true untuk @value. Tentukan nilai 1 untuk @force_invalidate_snapshot dan @force_reinit_subscription.

    • Di Publisher pada database publikasi, jalankan sp_changemergearticle. Tentukan nilai logical_record_level_conflict_resolution untuk @property dan nilai true untuk @value. Tentukan nilai 1 untuk @force_invalidate_snapshot dan @force_reinit_subscription.

  2. Untuk menggunakan deteksi dan resolusi konflik tingkat baris atau kolom standar:

    • Di Publisher pada database publikasi, jalankan sp_changemergearticle. Tentukan nilai logical_record_level_conflict_detection untuk @property dan nilai false untuk @value. Tentukan nilai 1 untuk @force_invalidate_snapshot dan @force_reinit_subscription.

    • Di Publisher pada database publikasi, jalankan sp_changemergearticle. Tentukan nilai logical_record_level_conflict_resolution untuk @property dan nilai false untuk @value. Tentukan nilai 1 untuk @force_invalidate_snapshot dan @force_reinit_subscription.

Untuk menghapus hubungan rekaman logis

  1. Di Publisher pada database publikasi, jalankan kueri berikut untuk mengembalikan informasi tentang semua hubungan rekaman logis yang ditentukan untuk publikasi yang ditentukan:

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

    Perhatikan nama hubungan rekaman logis yang dihapus di kolom nama filter dalam tataan hasil.

    Catatan

    Kueri ini mengembalikan informasi yang sama dengan sp_helpmergefilter; namun, prosedur tersimpan sistem ini hanya mengembalikan informasi tentang hubungan rekaman logis yang juga merupakan filter gabungan.

  2. Di Publisher pada database publikasi, jalankan sp_dropmergefilter. Tentukan @publication, nama salah satu artikel dalam hubungan untuk @article, dan nama hubungan dari langkah 1 untuk @filtername.

Contoh (Transact-SQL)

Contoh ini memungkinkan partisi yang telah dikompilasi sebelumnya pada publikasi yang ada, dan membuat catatan logis yang terdiri dari dua artikel baru untuk SalesOrderHeader tabel dan 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

Menggunakan Objek Manajemen Replikasi (RMO)

Catatan

Replikasi penggabungan memungkinkan Anda menentukan bahwa konflik dilacak dan diselesaikan pada tingkat catatan logis, tetapi opsi ini tidak dapat diatur menggunakan RMO.

Untuk menentukan hubungan rekaman logis tanpa filter gabungan terkait

  1. Buat koneksi ke Publisher dengan menggunakan ServerConnection kelas .

  2. Buat instans MergePublication kelas, atur Name properti dan DatabaseName untuk publikasi, dan atur ConnectionContext properti ke koneksi yang dibuat di langkah 1.

  3. LoadProperties Panggil metode untuk mendapatkan properti objek. Jika metode ini mengembalikan false, properti publikasi di langkah 2 didefinisikan dengan tidak benar atau publikasi tidak ada.

  4. PartitionGroupsOption Jika properti diatur ke False, atur ke True.

  5. Jika artikel yang akan terdiri dari catatan logis tidak ada, buat instans MergeArticle kelas, dan atur properti berikut:

    • Nama artikel untuk Name.

    • Nama publikasi untuk PublicationName.

    • (Opsional) Jika artikel difilter secara horizontal, tentukan klausa filter baris untuk FilterClause properti . Gunakan properti ini untuk menentukan filter baris statis atau parameter. Untuk informasi selengkapnya, lihat Filter Baris Berparameter.

    Untuk informasi selengkapnya, lihat Menentukan Artikel.

  6. Panggil Create metode.

  7. Ulangi langkah 5 dan 6 untuk setiap artikel yang terdiri dari catatan logis.

  8. Buat instans MergeJoinFilter kelas untuk menentukan hubungan rekaman logis antar artikel. Kemudian, atur properti berikut:

  9. AddMergeJoinFilter Panggil metode pada objek yang mewakili artikel anak dalam hubungan. Teruskan MergeJoinFilter objek dari langkah 8 untuk menentukan hubungan.

  10. Ulangi langkah 8 dan 9 untuk setiap hubungan rekaman logis yang tersisa dalam publikasi.

Contoh (RMO)

Contoh ini membuat catatan logis yang terdiri dari dua artikel baru untuk SalesOrderHeader tabel dan SalesOrderDetail .

           // Define the Publisher and publication names.
           string publisherName = publisherInstance;
           string publicationName = "AdvWorksSalesOrdersMerge";
           string publicationDbName = "AdventureWorks2022";

           // Specify article names.
           string articleName1 = "SalesOrderHeader";
           string articleName2 = "SalesOrderDetail";
           
           // Specify logical record information.
           string lrName = "SalesOrderHeader_SalesOrderDetail";
           string lrClause = "[SalesOrderHeader].[SalesOrderID] = "
               + "[SalesOrderDetail].[SalesOrderID]";

           string schema = "Sales";

           MergeArticle article1 = new MergeArticle();
           MergeArticle article2 = new MergeArticle();
           MergeJoinFilter lr = new MergeJoinFilter();
           MergePublication publication = new MergePublication();

           // Create a connection to the Publisher.
           ServerConnection conn = new ServerConnection(publisherName);

           try
           {
               // Connect to the Publisher.
               conn.Connect();

               // Verify that the publication uses precomputed partitions.
               publication.Name = publicationName;
               publication.DatabaseName = publicationDbName;
               publication.ConnectionContext = conn;

               // If we can't get the properties for this merge publication, then throw an application exception.
               if (publication.LoadProperties())
               {
                   // If precomputed partitions is disabled, enable it.
                   if (publication.PartitionGroupsOption == PartitionGroupsOption.False)
                   {
                       publication.PartitionGroupsOption = PartitionGroupsOption.True;
                   }
               }
               else
               {
                   throw new ApplicationException(String.Format(
                       "Settings could not be retrieved for the publication. " +
                       "Ensure that the publication {0} exists on {1}.",
                       publicationName, publisherName));
               }

               // Set the required properties for the PurchaseOrderHeader article.
               article1.ConnectionContext = conn;
               article1.Name = articleName1;
               article1.DatabaseName = publicationDbName;
               article1.SourceObjectName = articleName1;
               article1.SourceObjectOwner = schema;
               article1.PublicationName = publicationName;
               article1.Type = ArticleOptions.TableBased;

               // Set the required properties for the SalesOrderDetail article.
               article2.ConnectionContext = conn;
               article2.Name = articleName2;
               article2.DatabaseName = publicationDbName;
               article2.SourceObjectName = articleName2;
               article2.SourceObjectOwner = schema;
               article2.PublicationName = publicationName;
               article2.Type = ArticleOptions.TableBased;

               if (!article1.IsExistingObject) article1.Create();
               if (!article2.IsExistingObject) article2.Create();

               // Define a logical record relationship between 
               // PurchaseOrderHeader and PurchaseOrderDetail. 

               // Parent article.
               lr.JoinArticleName = articleName1;
               
               // Child article.
               lr.ArticleName = articleName2;
               lr.FilterName = lrName;
               lr.JoinUniqueKey = true;
               lr.FilterTypes = FilterTypes.LogicalRecordLink;
               lr.JoinFilterClause = lrClause;

               // Add the logical record definition to the parent article.
               article1.AddMergeJoinFilter(lr);
           }
           catch (Exception ex)
           {
               // Do error handling here and rollback the transaction.
               throw new ApplicationException(
                   "The filtered articles could not be created", ex);
           }
           finally
           {
               conn.Disconnect();
           }
' Define the Publisher and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"

' Specify article names.
Dim articleName1 As String = "SalesOrderHeader"
Dim articleName2 As String = "SalesOrderDetail"

' Specify logical record information.
Dim lrName As String = "SalesOrderHeader_SalesOrderDetail"
Dim lrClause As String = "[SalesOrderHeader].[SalesOrderID] = " _
        & "[SalesOrderDetail].[SalesOrderID]"

Dim schema As String = "Sales"

Dim article1 As MergeArticle = New MergeArticle()
Dim article2 As MergeArticle = New MergeArticle()
Dim lr As MergeJoinFilter = New MergeJoinFilter()
Dim publication As MergePublication = New MergePublication()

' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Verify that the publication uses precomputed partitions.
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = conn

    ' If we can't get the properties for this merge publication, then throw an application exception.
    If publication.LoadProperties() Then
        ' If precomputed partitions is disabled, enable it.
        If publication.PartitionGroupsOption = PartitionGroupsOption.False Then
            publication.PartitionGroupsOption = PartitionGroupsOption.True
        End If
    Else
        Throw New ApplicationException(String.Format( _
            "Settings could not be retrieved for the publication. " _
            & "Ensure that the publication {0} exists on {1}.", _
            publicationName, publisherName))
    End If

    ' Set the required properties for the SalesOrderHeader article.
    article1.ConnectionContext = conn
    article1.Name = articleName1
    article1.DatabaseName = publicationDbName
    article1.SourceObjectName = articleName1
    article1.SourceObjectOwner = schema
    article1.PublicationName = publicationName
    article1.Type = ArticleOptions.TableBased

    ' Set the required properties for the SalesOrderDetail article.
    article2.ConnectionContext = conn
    article2.Name = articleName2
    article2.DatabaseName = publicationDbName
    article2.SourceObjectName = articleName2
    article2.SourceObjectOwner = schema
    article2.PublicationName = publicationName
    article2.Type = ArticleOptions.TableBased

    If Not article1.IsExistingObject Then
        article1.Create()
    End If
    If Not article2.IsExistingObject Then
        article2.Create()
    End If

    ' Define a logical record relationship between 
    ' SalesOrderHeader and SalesOrderDetail. 

    ' Parent article.
    lr.JoinArticleName = articleName1
    ' Child article.
    lr.ArticleName = articleName2
    lr.FilterName = lrName
    lr.JoinUniqueKey = True
    lr.FilterTypes = FilterTypes.LogicalRecordLink
    lr.JoinFilterClause = lrClause

    ' Add the logical record definition to the parent article.
    article1.AddMergeJoinFilter(lr)
Catch ex As Exception
    ' Do error handling here and rollback the transaction.
    Throw New ApplicationException( _
            "The filtered articles could not be created", ex)
Finally
    conn.Disconnect()
End Try

Lihat Juga

Tentukan dan Ubah Filter Gabungan Antara Artikel Penggabungan
Menentukan dan Mengubah Filter Baris Berparameter untuk Artikel Penggabungan
Menentukan dan Memodifikasi Filter Baris Statis
Perubahan Grup pada Baris Terkait dengan Rekaman Logis
Optimalkan Performa Filter Berparameter dengan Partisi yang Telah Dikomputasi
Perubahan Grup pada Baris Terkait dengan Rekaman Logis