Aracılığıyla paylaş


Değişiklikler için işlem makaleleri nasıl yayılma belirtme

Işlem çoğaltma, veri değişiklikleri abonelerine yayımcıdan nasıl yayılır belirlemenizi sağlar.Yayımlanan her tablo için (INSERT, UPDATE veya DELETE) her operasyon için abone dağıtılmasını dört şekilde belirtebilirsiniz:

  • Işlem çoğaltma değişiklikleri aboneleri (varsayılan) için saklı bir yordam dışarı ve daha sonra komut dosyası çağırın belirtin.

  • INSERT, UPDATE veya DELETE deyim kullanarak değişiklik dağıtılmasını olduğunu belirtin (varsayılan değeri olmayan-SQL Server Abonelerin).

  • Özel saklı yordam kullanılması gerektiğini belirtin.

  • Bu eylem tüm Abone tarafında gerçekleştirilmesi gerektiğini değil belirtin.Bu tür hareketler çoğaltılır.

Varsayılan olarak, işlem çoğaltma aboneleri yapılan yayılan bir küme her abone üzerinde yüklü olan saklı yordamlar.Bir ekleme, güncelleştirme veya silme oluşur bir tablo Yayımcı tarafında, işlem sırasında abone bir saklı yordam çağrısı çevrilir.Saklı yordam içindeki sütunları eşleştirmek parametreleri kabul tablo, bu sütun, Abone tarafında değiştirilmesine izin verir.

Için küme işlem makalelerine veri ilgili yayma yöntem değiştirir

Varsayılan ve özel saklı yordamlarda

Her tablo makale için üç yordamlar, varsayılan olarak, çoğaltma oluşturur:

  • sp_MSins_<tabloadı>, ekler, bir işleme.

  • sp_MSupd_<tabloadı>, hangi güncelleştirmeleri işler.

  • sp_MSdel_<tabloadı>, siler, bir işleme.

The <tablename> used in the procedure depends on how the makale was added to the yayın and whether the abonelik veritabanı contains a tablo of the same name with a different owner.

Bu yordamlar, herhangi bir özel yordamla belirttiğiniz bir makale ekleme, değiştirilebilir bir yayın.Bir denetim içinde veri ekleme gibi özel mantık, bir uygulamayı gerektiriyorsa, özel yordamlar kullanılan tablo olduğunda, satır bir Abone tarafında güncelleştirildi.Özel saklı yordamlarda belirtme hakkında daha fazla bilgi için yukarıda listelenen konular nasıl bakın.

Çoğaltma yordamlar varsayılan veya özel yordamlar belirtirseniz, ayrıca her yordam çağrısının söz diziminin'nı belirtin (varsayılan yordamlar kullanırsanız, çoğaltma varsayılanları seçer).Çağrı sözdizimi yordamını ve ne kadar bilgi, her bir veri değişikliği için abone gönderilen sağlanan parametreleri yapısı belirler.Daha fazla bilgi için bu konudaki "Call sözdizimi için saklı yordamlar" bölümüne bakın.

Özel kullanma konuları yordamlar depolanan...

Özel saklı yordamlarda kullanırken, aşağıdaki konuları göz önünde bulundurun:

  • Mantık bir saklı yordam; desteklemesi gerekir Microsoft destek için özel bir mantığı sağlamaz.

  • Çoğaltma tarafından kullanılan hareketlerle çakışmaları önlemek için açık hareketler özel yordamlar kullanılmamalıdır.

  • Abone sırasında şemayı şema yayımcı sırasında genellikle aynıdır, ancak Publisher şemasının alt küme küme küme sütun süzme kullanılıyorsa da olabilir.Ancak, schema olarak dönüştürmek istiyorsanız, yayımcı üzerinde şemasının alt küme küme küme şema üzerinde abone değil, verileri taşınır SQL Server 2008 Integration Services (SSIS) (SSIS) önerilen çözümdür. Daha fazla bilgi için bkz: SQL Server Tümleştirme Hizmetleri.

  • Yayımlanmış bir tablo için şema değişikliklerini yaparsanız, özel yordamlar yeniden gerekir.Daha fazla bilgi için bkz: Özel işlem yordamlar, şema değişiklikleri Yansıt için yeniden oluşturuluyor.

  • Için 1'den büyük bir değer kullanırsanız -SubscriptionStreams parametre Dağıtım Aracısı'nın, birincil anahtar sütunlarını güncelleştirmelerin başarılı olduğundan emin olmalısınız.Örneğin:

    update ... set pk = 2 where pk = 1 -- update 1
    update ... set pk = 3 where pk = 2 -- update 2
    

    Dağıtım aracı, birden fazla bağlantısı kullanıyorsa, bu iki güncelleştirmelerin farklı bağlantılar üzerinden yinelenmiş.Ilk 1 güncelleştirme uygulanırsa, hiçbir sorun yok; güncelleştirmesi 2 uygulanırsa 1 güncelleştirme henüz oluştuğu için önce onu '0 satır etkilenen' döndürecektir.Bu durum, satır bir güncelleştirme etkileniyorsanız, hata yükselterek varsayılan yordamlarda işlenir:

    if @@rowcount = 0
        if @@microsoftversion>0x07320000
            exec sys.sp_MSreplraiserror 20598
    

    Hatayı yükseltme güncelleştirmelerin başarılı olur, tek bir bağlantı, yeniden denemek için dağıtım aracısını zorlar.Özel saklı yordamlarda, benzer mantığı eklemeniz gerekir.

Sözdizimi için saklı yordamlar arayın...

Işlem çoğaltma tarafından kullanılan yordamları çağırmak için kullanılan sözdizimi beş seçenek vardır:

  • CALL sözdizimi.Ekler, güncelleştirmeleri ve silmeleri için kullanılabilir.Varsayılan olarak, çoğaltma ekler ve siler bu sözdizimini kullanır.

  • SCALL sözdizimi.Yalnızca güncelleştirmeleri için kullanılabilir.Varsayılan olarak, çoğaltma, güncelleştirmeleri bu sözdizimini kullanır.

  • MCALL sözdizimi.Yalnızca güncelleştirmeleri için kullanılabilir.

  • XCALL sözdizimi.Güncelleştirmeleri ve silmeleri için kullanılabilir.

  • vcall.Güncelleştirilebilir abonelikler için kullanılır.Yalnızca iç kullanım.

Her yöntemin, abone için yayılır veri miktarı değişir.Örneğin, gerçekte bir güncelleştirmeyle etkilenen sütun değerleri SCALL geçirir.XCALL, buna ek olarak, (veya bir güncelleştirmesinden etkilenen olup olmadığını) tüm sütunları gerektirir ve eski veri değerleri her sütun için.Çoğu durumda, SCALL güncelleştirmeleri için uygundur, ancak uygulama bir güncelleştirmesi sırasında tüm veri değerleri gerektiriyorsa, XCALL bu verir.

CALL sözdizimi

  • Saklı yordamlar INSERT
    INSERT deyimleri işleme saklı yordamlar, eklenen tüm sütunların değerlerini gönderilir:

    c1, c2, c3,... cn
    
  • Saklı yordamlar UPDATE
    UPDATE deyimleri işleme saklı yordamlar, özgün değerleri için birincil anahtar sütunlarını (hangi sütunların değiştirilmiş belirlemek için girişimde bulunulmaz.) ve ardından bu makale tanımlanan tüm sütunlar için güncelleştirilmiş değerleri gönderilir:

    c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn
    
  • Saklı yordamlar DELETE
    DELETE deyimleri işleme saklı yordamlar için birincil anahtar sütunlarını değerler geçirildi:

    pkc1, pkc2, pkc3,... pkcn
    

SCALL sözdizimi

  • Saklı yordamlar UPDATE
    UPDATE deyimi işleme saklı yordamlar, güncelleştirilmiş değişmiş olan, bir bit maskesi () tarafından izlenen birincil anahtar sütunları, özgün değerleri peşinden sütun değerleri geçirilecekbinary(n)) parametresi değiştirilen sütunları gösterir. Aşağıdaki örnekte, sütun2 (c2) değiştirildi:

    c1, , c3,... cn, pkc1, pkc2, pkc3,... pkcn, bitmask
    

MCALL sözdizimi

  • Saklı yordamlar UPDATE
    UPDATE deyimi işleme saklı yordamlar, özgün değerleri için bir bit maskesi () tarafından izlenen birincil anahtar sütunları, ardından bu makale tanımlanan tüm sütunlar için güncelleştirilmiş değerleri geçirilecekbinary(n)) parametresi değiştirilen sütunlarını gösterir:

    c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn, bitmask
    

XCALL sözdizimi

  • Saklı yordamlar UPDATE
    UPDATE deyimi işleme saklı yordamlar, özgün değerleri geçirilecek (görüntü önce) makalesinde tanımlanan tüm sütunlar için makale tanımlanan tüm sütunlar için güncelleştirilmiş değerleri (sonra görüntü) ve ardından:

    old-c1, old-c2, old-c3,... old-cn, c1, c2, c3,... cn,
    
  • Saklı yordamlar DELETE
    DELETE deyimleri işleme saklı yordamlar, özgün geçirilecek (görüntü önce) makalesinde tanımlanan tüm sütunlar için değer:

    old-c1, old-c2, old-c3,... old-cn
    

    Not

    XCALL, kullanırken önce görüntü değerleri metin and Görüntü sütunlar, NULL olması beklenir.

Örnekler

Aşağıdaki yordamlar için oluşturulan varsayılan yordamlar olan Satıcı tablo (AdventureWorks) içinde Adventure Works Örnek Veritabanı'nı tıklatın.

--INSERT procedure using CALL syntax
create procedure [sp_MSins_PurchasingVendor] 
  @c1 int,@c2 nvarchar(15),@c3 nvarchar(50),@c4 tinyint,@c5 bit,@c6 bit,@c7 nvarchar(1024),@c8 datetime
as 
begin 
insert into [Purchasing].[Vendor]( 
 [VendorID]
,[AccountNumber]
,[Name]
,[CreditRating]
,[PreferredVendorStatus]
,[ActiveFlag]
,[PurchasingWebServiceURL]
,[ModifiedDate]
 )
values ( 
 @c1
,@c2
,@c3
,@c4
,@c5
,@c6
,@c7
,@c8
 ) 
end
go


--UPDATE procedure using SCALL syntax
create procedure [sp_MSupd_PurchasingVendor] 
 @c1 int = null,@c2 nvarchar(15) = null,@c3 nvarchar(50) = null,@c4 tinyint = null,@c5 bit = null,@c6 bit = null,@c7 nvarchar(1024) = null,@c8 datetime = null,@pkc1 int
,@bitmap binary(2)
as
begin
update [Purchasing].[Vendor] set 
 [AccountNumber] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [AccountNumber] end
,[Name] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [Name] end
,[CreditRating] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [CreditRating] end
,[PreferredVendorStatus] = case substring(@bitmap,1,1) & 16 when 16 then @c5 else [PreferredVendorStatus] end
,[ActiveFlag] = case substring(@bitmap,1,1) & 32 when 32 then @c6 else [ActiveFlag] end
,[PurchasingWebServiceURL] = case substring(@bitmap,1,1) & 64 when 64 then @c7 else [PurchasingWebServiceURL] end
,[ModifiedDate] = case substring(@bitmap,1,1) & 128 when 128 then @c8 else [ModifiedDate] end
where [VendorID] = @pkc1
if @@rowcount = 0
    if @@microsoftversion>0x07320000
        exec sp_MSreplraiserror 20598
end
go


--DELETE procedure using CALL syntax
create procedure [sp_MSdel_PurchasingVendor] 
  @pkc1 int
as 
begin 
delete [Purchasing].[Vendor]
where [VendorID] = @pkc1
if @@rowcount = 0
    if @@microsoftversion>0x07320000
        exec sp_MSreplraiserror 20598
end 
go