Aracılığıyla paylaş


Nasıl yapılır: Birleştir tablo makaleleri (çoğaltma Transact-SQL programlama) arasındaki mantıksal kayıt ilişki tanımla

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.

Birleştirme çoğaltma , farklı tablolardaki ilişkili satırları arasında bir ilişki tanımlamanızı sağlar.Bu satırları eşitleme sırasında işlem birimi olarak işlenebilmesi anlamına gelir.mantıksal kayıt olmasa da sahip oldukları iki makaleleri arasında tanımlanabilir bir birleşim filtresi ilişkisi.Daha fazla bilgi için bkz: Değişiklikleri'mantıksal kayıtları ile ilgili satırları gruplandırma.Çoğaltma depolanmış yordamları kullanarak makaleleri arasındaki mantıksal kayıt ilişkileri programlı olarak belirtebilirsiniz.

Bir ilişkili olmayan mantıksal kayıt ilişki tanımlamak içinbirleşim filtresi

  1. yayın süzülür tüm makaleleri içeriyorsa, yürütmek sp_helpmergepublicationve değerini not alın use_partition_groups de sonuç küme.

    • Değer ise 1, bölümleri zaten kullanıldığından önceden hesaplanan.

    • Değer ise 0, daha sonra yürütmek sp_changemergepublication yayın veritabanı üzerinde yayımcı adresindeki.Değeri belirtmek use_partition_groups için @ özellik değeri doğru için @ değeri.

      Not

      yayın precomputed bölümleri desteklemiyorsa, mantıksal kayıtlar kullanılamaz.Daha fazla bilgi için önceden hesaplanan bölümleri kullanma gereksinimleri konusuna bakın Parametreli Filtresi performans Precomputed bölümleri ile en iyi duruma getirme.

    • Değer null olur sonra Anlık Görüntü Aracısı oluşturmak için çalıştırılması gerekiyor ilk anlık görüntü yayın.

  2. mantıksal kayıt oluşturan makaleleri yoksa, yürütmek sp_addmergearticle yayın veritabanı üzerinde yayımcı adresindeki.Aşağıdaki çakışma algılama ve mantıksal kayıt çözümleme seçenekleri belirtin:

    • Algılamak ve ilişkili satırları mantığı kayıtta içinde oluşan çakışmaları çözmek için değerini belirtin doğru için @ logical_record_level_conflict_detection ve logical_record_level_conflict_resolution @.

    • Standart satır veya sütun - kullanmak içindüzey değerini belirtin, çakışma algılama ve Çözümlemesi yanlış için @ logical_record_düzey_conflict_detection ve @ logical_record_düzey_conflict_resolution, varsayılan değerdir.

  3. 2 mantıksal kayıt oluşturan her makale için yineleyin.Her makalede için aynı çakışma algılama ve Çözümlemesi seçeneğini kullanın mantıksal kayıt.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 yürütmek sp_addmergefilter.Belirtmek @ yayın, ilişki için bir makalenin adını @ makale, için ikinci makalenin adını @ join_articlename, için ilişki için bir ad @ FiltreAdı, ikisi arasındaki ilişkiyi tanımlayan yan tümce tümce tümce tümce makaleleri için @ join_filterclause, bir tür birleştirmek için @ join_unique_key ve aşağıdaki değerleri için @ filter_type:

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

    • 3 -Mantıksal bir ilişki ile tanımlayan bir birleşim filtresi.

    Not

    Yoksa bir birleştirmek filtresi ise kullanılmıyor, iki makaleleri arasında ilişki yönü önemli değil.

  5. Adımı yineleyin 2'de kalan her mantıksal kayıt ilişki için yayın.

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

  1. algılamakk ve ilişkili satırlara içinde oluşan çakışmaları çözmek için mantıksal kayıt:

    • yayın veritabanı üzerinde Yayımcı tarafında yürütmek sp_changemergearticle.Değeri belirtmek logical_record_level_conflict_detection için @ özellik değeri doğru için @ değeri.Bir değer belirtmek 1 için @ force_invalidate_snapshot ve @ force_reinit_subscription.

    • yayın veritabanı üzerinde Yayımcı tarafında yürütmek sp_changemergearticle.Değeri belirtmek logical_record_level_conflict_resolution için @ özellik değeri doğru için @ değeri.Bir değer belirtmek 1 için @ force_invalidate_snapshot ve @ force_reinit_subscription.

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

    • yayın veritabanı üzerinde Yayımcı tarafında yürütmek sp_changemergearticle.Değeri belirtmek logical_record_level_conflict_detection için @ özellik değeri yanlış için @ değeri.Bir değer belirtmek 1 için @ force_invalidate_snapshot ve @ force_reinit_subscription.

    • yayın veritabanı üzerinde Yayımcı tarafında yürütmek sp_changemergearticle.Değeri belirtmek logical_record_level_conflict_resolution için @ özellik değeri yanlış için @ değeri.Bir değer belirtmek 1 için @ force_invalidate_snapshot ve @ force_reinit_subscription.

mantıksal kayıt ilişki kaldırmak için

  1. Üzerinde yayımcı adresindeki yayın veritabanı, belirtilen yayın için tanımlanmış olan tüm mantıksal kayıt ilişkileri hakkında bilgi dönmek için aşağıdaki sorguyu çalıştırın:

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

    Kaldırılmakta olan mantıksal kayıt ilişki adını not filtername sütununda sonuç küme.

    Not

    Bu sorgu aynı bilgileri verir sp_helpmergefilter; Ancak, bu sistem saklı yordamı yalnızca birleştirmek filtreleri olan mantıksal kayıt ilişkileri hakkında bilgi verir.

  2. yayın veritabanı üzerinde Yayımcı tarafında yürütmek sp_dropmergefilter.Belirtmek @ yayın, makaleler için ilişki içinde birinin adını @ makaleve adım 1 için ilişkinin adını @ FiltreAdı.

Örnek

Bu örnek üzerinde varolan bir precomputed bölümleri etkinleştirir yayınve SalesOrderHeader ve SalesOrderDetail tablolar için iki yeni makaleleri kapsayan mantıksal kayıt oluşturur.

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