Birleştir tablo makaleleri arasındaki mantıksal kayıt ilişki tanımla

Bu konu arasında birleştirme tablo makalelerinde mantıksal kaydı ilişki tanımlamak nasıl açıklar SQL Server 2012kullanarak SQL Server Management Studio, Transact-SQL, ya da Çoğaltma Yönetimi Nesneleri'ni (rmo).

Birleştirme çoğaltması ilgili satırları farklı tablolar arasında bir ilişki tanımlamanızı sağlar. Bu satırların ardından Eşitleme sırasında işlem birim olarak işlenebilir. Mantıksal bir kayıt iki makaleleri arasında birleştirme filtre ilişkileri var olup olmadığı tanımlanabilir. Daha fazla bilgi için, bkz. Grup değişiklikleri'mantıksal kayıtları ile ilgili satırları.

[!NOT]

Bu özellik Microsoft SQL Server'ın ilerideki bir sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmaktan kaçının ve bu özelliği kullanmakta olan uygulamalarda değişiklik yapmayı planlayın.

Bu Konuda

  • Başlamadan Önce

    Sınırlamalar ve Kısıtlamalar

  • Birleştir tablo makaleleri, kullanma arasındaki mantıksal kaydı ilişki tanımlamak için:

    SQL Server Management Studio

    Transact-SQL

    Çoğaltma Yönetimi Nesneleri'ni (rmo)

Başlamadan Önce

Sınırlamalar ve Kısıtlamalar

  • Ekleme, değiştirme veya Yayını abonelikleri başlatıldıktan sonra mantıksal bir kayıt silme, yeni bir anlık görüntü oluşturmak ve değişiklik yaptıktan sonra tüm abonelikler yeniden gerekir. Özellik değişikliklerini gereksinimleri hakkında daha fazla bilgi için bkz: Değişiklik yayın ve makalesi özellikleri.

Başa Dön bağlantısıyla kullanılan ok simgesi[Top]

SQL Server Management Studio Kullanarak

Mantıksal kayıtları tanımlamak Ekle Katıl iletişim kutusunda, Yeni Yayın Sihirbazı'nda bulunan ve Yayını özellikleri - <yayın > iletişim kutusu. Sihirbaz ve iletişim kutusuna erişme hakkında daha fazla bilgi için bkz: Yayın oluşturmave Yayın özelliklerini görüntüleme ve değiştirme.

Mantıksal kayıtları olarak tanımlanabilir Katılma ekleme iletişim kutusu yalnızca, onlar bir birleştirme yayını birleştirme filtre uygulanır ve Yayını precomputed bölümler kullanma gereksinimleri aşağıdaki gibidir. Filtreler katılın ve mantıksal kayıt düzeyinde çakışma algılaması ve çözümlemesi için uygulanmaz mantıksal kayıtları tanımlamak için saklı yordamları kullanmanız gerekir.

Mantıksal kaydı ilişki tanımlamak için

  1. Tarih Filtre tablosu satır sayfa yeni yayın sihirbazını veya Filtre satırları sayfası Yayını özellikleri - <yayın > iletişim kutusunda, bir satır filtre seçin Süzülmüş tablolar bölmesi.

    Mantıksal kaydı ilişki genişleten bir satır filtre birleştirme filtre ile ilişkilidir. Bu nedenle önce filtre birleştirme ile genişletebilir ve mantıksal kaydı ilişki geçerli satır filtre tanımlamalısınız. Bir birleşim filtre tanımlandıktan sonra bu birleşim filtre ile başka bir birleşim filtre genişletebilirsiniz. Birleşim filtreleri tanımlama hakkında daha fazla bilgi için bkz: Tanımla ve birleştirme makaleleri arasında birleştirme filtre Değiştir.

  2. Tıklayın Ekleve'yi Ekle Katıl uzatma seçili filtre için.

  3. Birleşim filtre tanımlamak Katılma ekleme iletişim kutusunu ve sonra kutuyu seçin Mantıksal kaydı.

  4. Eğer Yayını özellikleri - <yayın > iletişim kutusu'yı Tamam kaydetmek ve iletişim kutusunu kapatın.

Mantıksal kaydı ilişkiyi silmek için

  • Mantıksal kaydı ilişkiyi silmek veya mantıksal kaydı ilişki ve ilişkili birleştirme filtre Sil.

    Mantıksal kaydı ilişkiyi silmek için:

    1. Tarih Filtre satırları sayfa yeni yayın sihirbazını veya Filtre satırları sayfası Yayını özellikleri - <yayın > iletişim kutusunda, mantıksal kaydı ilişki içinde ilişkili birleştirme filtre seçin Süzülmüş tablolar bölmesi ve sonra düzenleme.

    2. İçinde Katıl Düzenle iletişim kutusunda, onay kutusunu temizleyin Mantıksal kaydı.

    3. Tamam’ı tıklatın.

    İlişkili mantıksal kaydı ilişki ve birleşim filtreyi silmek için:

    • Tarih Filtre satırları sayfa yeni yayın sihirbazını veya Yayını özellikleri - <yayın > iletişim kutusunda, bir filtre seçin Süzülmüş tablolar bölmesi ve sonra silmek. Sildiğiniz birleşim filtre kendisi tarafından diğer birleşimler genişletilmiş ise, bu birleşimler de silinir.

Başa Dön bağlantısıyla kullanılan ok simgesi[Top]

Transact-SQL'i Kullanma

Çoğaltma depolanmış yordamları kullanarak makaleleri arasında mantıksal kaydı ilişkileri programlı olarak belirtebilirsiniz.

Bir ilişkili birleştirme filtre olmadan mantıksal kaydı ilişki tanımlamak için

  1. Yayını süzülür tüm makaleleri içeriyorsa, idam eşdeğerdirsp_helpmergepublicationve değerini not alın use_partition_groups sonucu ayarlayın.

    • Değeri ise 1, sonra precomputed bölümleri zaten kullanılır.

    • Değeri ise 0, sonra idam sp_changemergepublication yayını veritabanı üzerinde yayımcı adresindeki. Değeri belirtmeniz use_partition_groups için @ özellik bir gerçek için @ değeri.

      [!NOT]

      Yayını precomputed bölümleri desteklemiyorsa, ardından mantıksal kayıtları kullanılamaz. Daha fazla bilgi için Precomputed bölümler kullanma gereksinimler konusuna bakın Parametreli Filtresi performans Precomputed bölümleri ile en iyi duruma getirme.

    • Değer null ise Snapshot aracı yayının ilk anlık görüntüsü oluşturmak için çalıştırılması gerekiyor.

  2. Mantıksal kaydı oluşturan makaleleri yoksa idam sp_addmergearticle yayını veritabanı üzerinde yayımcı adresindeki. Aşağıdaki çakışma algılama ve mantıksal kaydı çözünürlüğü seçeneklerini belirtin:

    • Algılamak ve ilişkili satırları mantığı kayıtta içinde oluşan çakışmaları çözmek için değeri belirtmeniz gerçek için @ logical_record_level_conflict_detection ve logical_record_level_conflict_resolution.

    • Standart satır veya sütun düzeyinde çakışma algılaması ve Çözümlemesi kullanmak için değeri belirtmeniz yanlış için @ logical_record_level_conflict_detection ve logical_record_level_conflict_resolution, varsayılan olduğu.

  3. 2 Mantıksal kaydı oluşturan her makale için işlemi yineleyin. Mantıksal kayıttaki her makale için aynı çakışma algılaması ve Çözümlemesi seçeneğini kullanmalısınız. Daha fazla bilgi için, bkz. Algılama ve mantıksal kayıtlar içinde çakışmaları çözme.

  4. Yayını veritabanı üzerinde Yayımcı tarafında idam sp_addmergefilter. Belirtmek @ yayın, ilişki için bir makale adı @ makale, ikinci makale için adı @ join_articlename, ilişki için bir ad @ FiltreAdı, ikisi arasındaki ilişkiyi tanımlayan bir yan ürünleri için @ join_filterclause, için birleşim türü @ join_unique_key ve değer aşağıdakilerden biri için @ filter_type:

    • 2 -Mantıksal bir ilişki tanımlar.

    • 3 -Mantıksal bir ilişki birleştirme filtre ile tanımlar.

    [!NOT]

    Birleşim filtre kullanılırsa, iki makaleleri arasında ilişki yönü önemli değil.

  5. Yayındaki kalan her mantıksal kaydı ilişki için adım 2'yi yineleyin.

Çakışma algılaması ve Çözümlemesi mantıksal kayıtları değiştirmek için

  1. Algılama ve mantıksal kayıttaki ilişkili satırları içinde oluşan çakışmaları çözmek için:

    • Yayını veritabanı üzerinde Yayımcı tarafında idam sp_changemergearticle. Değeri belirtmeniz logical_record_level_conflict_detection için @ özellik bir gerçek için @ değeri. Değeri belirtmeniz 1 için @ force_invalidate_snapshot ve @ force_reinit_subscription.

    • Yayını veritabanı üzerinde Yayımcı tarafında idam sp_changemergearticle. Değeri belirtmeniz logical_record_level_conflict_resolution için @ özellik bir gerçek için @ değeri. Değeri belirtmeniz 1 için @ force_invalidate_snapshot ve @ force_reinit_subscription.

  2. Standart satır düzeyi veya sütun düzeyinde çakışma algılaması ve Çözümlemesi kullanmak için:

    • Yayını veritabanı üzerinde Yayımcı tarafında idam sp_changemergearticle. Değeri belirtmeniz logical_record_level_conflict_detection için @ özellik bir yanlış için @ değeri. Değeri belirtmeniz 1 için @ force_invalidate_snapshot ve @ force_reinit_subscription.

    • Yayını veritabanı üzerinde Yayımcı tarafında idam sp_changemergearticle. Değeri belirtmeniz logical_record_level_conflict_resolution için @ özellik bir yanlış için @ değeri. Değeri belirtmeniz 1 için @ force_invalidate_snapshot ve @ force_reinit_subscription.

Mantıksal kaydı ilişki kaldırmak için

  1. Yayını veritabanı üzerinde Yayımcı tarafında belirtilen yayını için tanımlanan tüm mantıksal kaydı ilişkileri hakkında bilgi dönmek için aşağıdaki sorguyu yürütün:

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

    İçinde kaldırılmakta mantıksal kaydı ilişki adını not filternamesonuç kümesinde sütun.

    [!NOT]

    Bu sorgu aynı bilgileri verir sp_helpmergefilter; Ancak, bu sistem saklı yordamı yalnızca birleştirme filtreleri da mantıksal kaydı ilişkileri hakkında bilgi verir.

  2. Yayını veritabanı üzerinde Yayımcı tarafında idam sp_dropmergefilter. Belirtmek @ yayın, bir ilişki için yazı adı @ makale, ilişki için adım 1'de belirtilen adı @ FiltreAdı.

Örnek (Transact-sql)

Bu örnek, varolan bir yayına precomputed bölümlerinde etkinleştirir ve iki yeni makaleleri kapsayan mantıksal bir kayıt oluşturur SalesOrderHeaderve SalesOrderDetailtabloları.

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

Başa Dön bağlantısıyla kullanılan ok simgesi[Top]

Çoğaltma Yönetimi Nesneleri'ni (rmo) kullanarak

[!NOT]

Birleştirme çoğaltma çakışma izleniyor ve mantıksal kayıt düzeyinde çözümlenen belirtmenize olanak tanır, ancak rmo kullanarak bu seçenekleri ayarlanamıyor.

Bir ilişkili birleştirme filtre olmadan mantıksal kaydı ilişki tanımlamak için

  1. Kullanarak bir yayımcının bağlantısı oluşturmak ServerConnectionsınıf

  2. Örneğini MergePublicationSystem, sınıf Nameve DatabaseNameyayın ve kümesi özelliklerini ConnectionContext1. adımda oluşturduğunuz bağlantı özelliği.

  3. Arama LoadPropertiesnesne özelliklerini almak için yöntem. Bu yöntem ise false, adım 2 yayını özellikleri yanlış tanımlanan veya yayını yok.

  4. Eğer PartitionGroupsOptionözelliğini ayarlamak False, ayarlamak True.

  5. Mantıksal kaydı oluşturan olan makaleleri yoksa örneği oluşturmak MergeArticlesınıf ve aşağıdaki özellikleri ayarlayın:

    • Makale için adı Name.

    • Yayın adı PublicationName.

    • (İsteğe bağlı) Satır filtre yan tümcesi için yatay olarak makaleyi filtre uygulanmışsa belirtmek FilterClauseözellik. Statik veya Parametreli satır filtre belirtmek için bu özelliği kullanın. Daha fazla bilgi için, bkz. Parametreli satır süzgeçleri.

    Daha fazla bilgi için, bkz. Bir makale tanımlamak.

  6. Arama Createyöntemi.

  7. Mantıksal kaydı oluşan her makale için 5 ve 6 numaralı adımları yineleyin.

  8. Örneğini MergeJoinFiltermakaleleri arasında mantıksal kaydı ilişki tanımlamak için sınıf. Ardından, aşağıdaki özellikleri ayarlayın:

  9. Arama AddMergeJoinFilterilişkideki alt makale temsil eden nesne yöntemi. Geçmek MergeJoinFilternesne ilişki tanımlamak için 8 adım.

  10. Yayındaki kalan her mantıksal kaydı ilişki için 8 ve 9 numaralı adımları yineleyin.

Örnek (rmo)

Bu örnek, iki yeni makaleleri kapsayan mantıksal bir kayıt oluşturur SalesOrderHeaderve SalesOrderDetailtabloları.

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

// 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 = "AdventureWorks2012"

' 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

Başa Dön bağlantısıyla kullanılan ok simgesi[Top]

Ayrıca bkz.

Kavramlar

Tanımla ve birleştirme makaleleri arasında birleştirme filtre Değiştir

Tanımla ve birleştirme makalesi Parametreli satır filtre Değiştir

Tanımla ve statik satır filtre Değiştir

Grup değişiklikleri'mantıksal kayıtları ile ilgili satırları

Birleştir tablo makaleleri arasındaki mantıksal kayıt ilişki tanımla

Parametreli Filtresi performans Precomputed bölümleri ile en iyi duruma getirme

Grup değişiklikleri'mantıksal kayıtları ile ilgili satırları