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

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

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

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

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

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

Varsayılan olarak, değişiklikleri abonelerine her abone üzerinde yüklü olan saklı yordamlar kümesi için işlem çoğaltma yayar. INSERT, update veya delete oluşur yayımcı tabloda işlem abone saklı yordam çağrısı çevrilmiş. Saklı yordam, Abone tarafında değiştirilmesi bu sütunları izin tablosundaki sütunlar eşleyin parametrelerini kabul eder.

İşlem makaleleri veri değişiklikleri için yayılma yöntemi ayarla için bkz: İşlem makaleleri veri değişiklikleri için yayılma yöntemi ayarla.

Varsayılan ve özel saklı yordamlarda

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

  • sp_MSins_<tablename>, hangi işleme ekler.

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

  • sp_MSdel_<tablename>, hangi işleme siler.

**<tablename>**Kullanılan yordamı makaleyi yayını nasıl eklendiği ve abonelik veritabanı tablo farklı bir sahip ile aynı adı içerip bağlıdır.

Bu yordamlardan birini bir makale yayına eklerken belirttiğiniz özel yordamı ile değiştirilebilir. Bir uygulama, Abone tarafında bir satır güncelleştirildiğinde bir denetim tabloya veri ekleme gibi özel mantık, isterse özel yordamlar kullanılır. Özel saklı yordamlarda belirtme hakkında daha fazla bilgi için bkz: nasıl-e doğru yukarıda listelenen konular.

Varsayılan çoğaltma yordamları ya da özel yordamlar belirtirseniz, ayrıca her yordamı için sözdizimi arayın belirttiğiniz (çoğaltma seçer Varsayılanları varsayılan yordamları kullanırsanız). Çağrı sözdizimi, prosedür ve ne kadar bilgi için abone her veri değişikliği ile gönderilen için sağlanan parametreleri yapısı belirler. Daha fazla bilgi için bkz: "Çağrı sözdizimi saklı yordamları" bölümü Bu konuda.

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

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

  • Saklı yordam mantığına desteklemeli; MicrosoftÖzel mantık için destek sağlamaz.

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

  • Abone adresindeki şema yayımcı adresindeki şema genellikle aynıdır, ancak Publisher şemasının alt sütun filtre kullanılırsa da olabilir. Şeması olarak dönüştürmek gereken şema abone yayımcı şema kümesini değil öyle ki ancak verileri taşınır SQL Server 2012 Integration Services (SSIS)Önerilen çözüm. Daha fazla bilgi için, bkz. SQL Server Integration Services.

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

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

    update ... set pk = 2 where pk = 1 -- update 1
    update ... set pk = 3 where pk = 2 -- update 2
    
    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ştirmeleri farklı bağlantıları üzerinden yinelenmiş. Güncelleme 1 ilk olarak uygulanır, orada sorun yok; Güncelleme 2 uygulanırsa ilk o '0 rows tutkucun' döndürür Güncelleme 1 henüz oluştu değil çünkü. Bu durum, hiçbir satır bir güncelleme etkileniyorsa hata yükselterek varsayılan yordamları işlenir:

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

    Hata yükseltme Dağıtım Aracısı başarılı tek bir bağlantı güncelleştirmeleri yeniden 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ĞRI sözdizimi. Ekler, güncelleştirmeleri ve silmeleri için kullanılabilir. Varsayılan olarak, çoğaltma, ekler ve siler için 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 için 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 abonelikleri için kullanılır. Yalnızca iç kullanım.

Her yöntem için abone yayılma veri miktarı farklıdır. Örneğin, scall, aslında bir güncelleştirmesi tarafından etkilenen sütun değerleri geçirir. xcall, buna karşılık (ya da değil bir güncelleştirmesinden etkilenen olsun) tüm sütunları gerektirir ve tüm eski veri değerleri her sütun için. Birçok durumda, scall güncelleştirmeleri için uygun, ancak uygulama güncelleştirme sırasında tüm veri değerleri gerektiriyorsa, xcall bunun için izin verir.

ÇAĞRI sözdizimi

  • Saklı yordamlar INSERT
    INSERT deyimleri işleme saklı yordamlar tüm sütunları eklenen değerleri aktarılır:

    c1, c2, c3,... cn
    
    c1, c2, c3,... cn
    
  • Saklı yordamlar update
    update deyimleri işleme saklı yordamlar (hangi sütunların değiştirilmiş belirlemek için girişimi.) birincil anahtar sütunları özgün değerleri ardından bu makalede tanımlanan tüm sütunlar için güncelleştirilmiş değerleri aktarılır:

    c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn
    
    c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn
    
  • Saklı yordamları silme
    delete deyimleri işleme saklı yordamlar birincil anahtar sütunları değerleri aktarılır:

    pkc1, pkc2, pkc3,... pkcn
    
    pkc1, pkc2, pkc3,... pkcn
    

scall sözdizimi

  • Saklı yordamlar update
    update deyimleri işleme saklı yordamlar yalnızca değişiklik varsa, birincil anahtar sütunları özgün değerleri ardından, bir bit maskesi tarafından takip bu sütunlar için güncelleştirilmiş değerleri geçirilen (binary(n)) değiştirilen sütunlarını gösterir parametresi. Aşağıdaki örnekte, sütun 2 (c2) değişmedi:

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

mcall sözdizimi

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

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

xcall sözdizimi

  • Saklı yordamlar update
    update deyimleri işleme saklı yordamlar özgün değerleri geçirilen (resim önce) makalesinde tanımlanan tüm sütunlar için güncelleştirilmiş değerleri (sonra görüntü) makalesinde tanımlanan tüm sütunlar için izledi:

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

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

    [!NOT]

    xcall, kullanırken önce görüntü değerleri metin ve Resim sütunlar null olması bekleniyor.

Örnekler

Aşağıdaki yordamlar için oluşturulan varsayılan işlemlerdir Vendor Tablede 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

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

Ayrıca bkz.

Kavramlar

Işlem çoğaltma için makale seçenekleri