Aracılığıyla paylaş


Değişiklikleri için işlemsel makaleleri nasıl yayılma belirtme

İşlem çoğaltma veri değişiklikleri yayımcıdan abonelere nasıl yayılır belirtmenize olanak verir.Yayımlanan her tablo için (INSERT, update veya delete) her bir işlem için abone yayılır, dört şekilde belirtebilirsiniz:

  • Bu işlem çoğaltma aboneleri (varsayılan) değişiklikleri yaymak için bir saklı yordam out ve sonradan komut dosyası çağırın belirtin.

  • Değişikliği bir INSERT, update veya delete deyim kullanarak yayılması belirtin (varsayılan olmayan-SQL Server aboneleri).

  • Özel bir 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 değişiklikler abonelere her abone üzerinde yüklü olan saklı yordamlar küme aracılığıyla yayar.Bir ekleme, güncelleştirme veya silme yayımcı adresindeki bir tablo oluşur işlem veri abone adresindeki bir saklı yordam çağrısına dönüştürülür.Saklı yordam içindeki sütunları eşleştirmek parametreleri kabul eder tablo, bu sütunlar Abone tarafında değiştirilmesi izin verme.

İçin küme yayma yöntem veri değişiklikleri için işlemsel makaleleri

Varsayılan ve özel saklı yordamlarda

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

  • sp_MSins_<tablename>, işleme ekler.

  • sp_MSupd_<tablename>, güncelleştirmeleri gerçekleştirir.

  • sp_MSdel_<tablename>, işleme siler.

The <tablename> used in the procedure depends on how the article was added to the publication and whether the subscription database contains a table of the same name with a different owner.

Aşağıdaki yordamlardan herhangi birini, bir makale eklerken belirttiğiniz özel yordam ile değiştirilebilir bir yayın.Özel yordamlar kullanılan bir uygulama bir denetim veri ekleme gibi özel mantık gerektiriyorsa tablo ne zaman bir satır güncelleştirildiği bir Abone tarafında.Özel saklı yordamlarda belirtme hakkında daha fazla bilgi için bkz: Yukarıda sıralanan konular nasıl yapılır?.

Varsayılan çoğaltma yordamları veya özel yordamlar belirtirseniz, ayrıca her yordam için çağrı sözdizimi belirttiğiniz (çoğaltma seçerse varsayılan değeri varsayılan yordamları kullanın).Çağrı sözdizimi yordamı ve ne kadar bilgi için abone gönderilen her veri değişikliği ile sağlanan parametre yapısını belirler.Daha fazla bilgi için "Çağrı sözdizimi saklı yordamları" bölümüne bakın. Bu konuda.

Saklı yordamlar özel kullanma hakkında önemli noktalar

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

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

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

  • Şema abone adresindeki yayımcı adresindeki şema genellikle aynıdır, ancak alt küme küme küme kümesini Publisher şema sütun filtre kullanılırsa da olabilir.Şeması olarak dönüştürmek isterseniz abone üzerinde şema şema yayımcı üzerinde alt küme küme küme kümesidir, ancak veri taşınır SQL Server 2008 Integration Services (SSIS) ()SSIS) olan önerilen çözüm.Daha fazla bilgi için bkz: SQL Server Integration Services.

  • Yayımlanmış bir tablo için şema değişiklikleri yaparsanız, özel yordamlar yeniden oluşturulmaları gerekir.Daha fazla bilgi için bkz: Özel şema değişiklikleri yansıtmak için işlemsel yordamları yeniden oluşturuluyor.

  • İçin 1'den büyük bir değer kullanırsanız, - subscriptionstreams parametresi Dağıtım Aracısı'nın gerekir sağlamak birincil anahtar sütunlarını güncelleştirmeleri başarılı olur.Örneğin:

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

    Dağıtım Aracısı birden fazla bağlantısı kullanıyorsa, bu iki güncelleştirme farklı bağlantıları üzerinden yinelenmiş.Update 1 ilk olarak uygulanır, hiçbir sorun yoktur; Update 2 uygulanırsa, önce onu '0 etkilendi' döndürür Update 1 henüz oluştu değil çünkü.Bu durum varsayılan yordamları bir güncelleştirme üzerinde hiçbir satır etkileniyorsa hata yükselterek ele alınır:

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

    Hata oluşmadan güncelleştirmeleri başarılı olur, tek bir bağlantı üzerinden, yeniden denemek için Dağıtım Aracısı zorlar.Özel saklı yordamlarda benzer mantığı eklemeniz gerekir.

Saklı yordamlar için sözdizimi arayın

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

  • Çağrı sözdizimi.Ekler, güncelleştirmeleri ve silmeleri için kullanılır.Varsayılan olarak, çoğaltma ekleme ve silme için bu sözdizimini kullanır.

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

  • mcall sözdizimi.Yalnızca güncelleştirmeleri kullanılabilir.

  • xcall sözdizimi.Güncelleştirmeleri ve silmeleri için kullanılır.

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

Her yöntem için abone yayılır veri miktarına göre farklılık gösterir.Örneğin, aslında bir güncelleştirmesi tarafından etkilenen sütun değerleri scall geçirir.xcall, bunun tersine, (veya bir güncelleştirme tarafından etkileyip etkilemediğini) tüm sütunları gerektirir ve eski tüm veri değerleri her sütun için.Çoğu durumda, scall güncelleştirmeleri için uygun, ancak bir güncelleştirme sırasında tüm veri değerleri uygulamanız gerektiriyorsa, xcall Bunun için verir.

Çağrı sözdizimi

  • Saklı yordamlar Ekle
    INSERT deyimleri işleme saklı yordamlar tüm sütunlar için eklenen değerleri gönderilir:

    c1, c2, c3,... cn
    
  • Saklı yordamlar update
    update deyimleri işleme saklı yordamlar (hangi sütunların değiştirilmiş belirlemek için girişimde bulunulmaz.) birincil anahtar sütunları özgün değerleri 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 SİLİN
    delete deyimleri işleme saklı yordamlar için birincil anahtar sütunlarını değerler gönderilir:

    pkc1, pkc2, pkc3,... pkcn
    

scall sözdizimi

  • Saklı yordamlar update
    Değiştirmiş, birincil anahtar sütunları özgün değerleri ardından, bir bit maskesi ve ardından sütunlar için güncelleştirilmiş değerleri update deyimleri işleme saklı yordamlar geçirilen (binary(n)) gösteren değiştirilen sütunları. parametreAşağıdaki örnekte, sütun 2 (c2) değişti:

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

mcall sözdizimi

  • Saklı yordamlar update
    Bir bit maskesi ve ardından birincil anahtar sütunları özgün değerleri ardından bu makale tanımlanan tüm sütunlar için güncelleştirilmiş değerleri update deyimleri işleme saklı yordamlar geçirilen (binary(n)) değiştirilen sütunlarını gösterir parametresi:

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

xcall sözdizimi

  • Saklı yordamlar update
    Özgün değerleri update deyimleri işleme saklı yordamlar geçirilen (resim önce) 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ü) tarafından izlenen makale:

    old-c1, old-c2, old-c3,... old-cn, c1, c2, c3,... cn,
    
  • Saklı yordamlar SİLİN
    Özgün delete deyimleri işleme saklı yordamlar geçirilen (resim önce) tanımlanan tüm sütunlar için değerleri makale:

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

    Not

    xcall, kullanırken görüntü değerleri için önce metin ve Görüntü sütunlar beklendiği null olmalıdır.

Örnekler

Aşağıdaki yordamlar için oluşturulan varsayılan yordamları olan Satıcı , tablo Adventure Works örnek veritabanı.

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