Lezen in het Engels

Delen via


Transactionele artikelen - opgeven hoe wijzigingen worden doorgegeven

van toepassing op:SQL ServerAzure SQL Managed Instance

Met transactionele replicatie kunt u opgeven hoe gegevenswijzigingen van publisher worden doorgegeven aan abonnees. Voor elke gepubliceerde tabel kunt u een van de vier manieren opgeven waarop elke bewerking (INSERT, UPDATE of DELETE) moet worden doorgegeven aan de abonnee:

  • Geef op dat transactionele replicatie een script moet uitvoeren en vervolgens een opgeslagen procedure moet aanroepen om wijzigingen door te geven aan abonnees (de standaardinstelling).

  • Geef op dat de wijziging moet worden doorgegeven met de instructie INSERT, UPDATE of DELETE (de standaardinstelling voor niet-SQL Server-abonnees).

  • Geef op dat een aangepaste opgeslagen procedure moet worden gebruikt.

  • Geef op dat deze actie niet moet worden uitgevoerd bij een abonnee. Transacties van dat type worden niet gerepliceerd.

Transactionele replicatie geeft standaard wijzigingen door aan abonnees via een set opgeslagen procedures die op elke abonnee zijn geïnstalleerd. Wanneer een invoeg-, bijwerk- of verwijderbewerking plaatsvindt in een tabel in Publisher, wordt de bewerking omgezet in een aanroep naar een opgeslagen procedure bij de abonnee. De opgeslagen procedure accepteert parameters die zijn toegewezen aan de kolommen in de tabel, zodat deze kolommen kunnen worden gewijzigd bij de abonnee.

Zie De doorgiftemethode instellen voor gegevenswijzigingen in transactionele artikelenals u de doorgiftemethode wilt instellen voor gegevenswijzigingen in transactionele artikelen.

Standaard en aangepaste opgeslagen procedures

De drie procedures die met replicatie standaard worden gemaakt voor elk tabelartikel zijn:

  • sp_MSins_<tabelnaam>, waarmee invoegingen worden afgehandeld.

  • sp_MSupd_<tabelnaam>, waarmee updates worden verwerkt.

  • sp_MSdel_<tabelnaam>, waarmee verwijderingen worden verwerkt.

De <tabelnaam die> in de procedure wordt gebruikt, is afhankelijk van de manier waarop het artikel is toegevoegd aan de publicatie en of de abonnementsdatabase een tabel met dezelfde naam met een andere eigenaar bevat.

Elk van deze procedures kan worden vervangen door een aangepaste procedure die u opgeeft bij het toevoegen van een artikel aan een publicatie. Aangepaste procedures worden gebruikt als een toepassing aangepaste logica vereist, zoals het invoegen van gegevens in een audittabel wanneer een rij wordt bijgewerkt bij een abonnee. Raadpleeg de bovenstaande onderwerpen voor meer informatie over het specificeren van aangepaste opgeslagen procedures.

Als u de standaardreplicatieprocedures of aangepaste procedures opgeeft, geeft u ook de aanroepsyntaxis voor elke procedure op (replicatie selecteert standaardwaarden als u de standaardprocedures gebruikt). De aanroepsyntaxis bepaalt de structuur van de parameters die aan de procedure worden verstrekt en hoeveel informatie wordt verzonden naar de abonnee bij elke wijziging van de gegevens. Zie de sectie 'Aanroepsyntaxis voor opgeslagen procedures' in dit onderwerp voor meer informatie.

Overwegingen voor het gebruik van aangepaste opgeslagen procedures

Houd rekening met de volgende overwegingen bij het gebruik van aangepaste opgeslagen procedures:

  • U moet de logica in de opgeslagen procedure ondersteunen; Microsoft biedt geen ondersteuning voor aangepaste logica.

  • Om conflicten met de transacties die door replicatie worden gebruikt te voorkomen, mogen expliciete transacties niet worden gebruikt in aangepaste procedures.

  • Het schema bij de abonnee is doorgaans identiek aan het schema in Publisher, maar kan ook een subset van het Publisher-schema zijn als kolomfiltering wordt gebruikt. Als u het schema echter moet transformeren omdat de gegevens worden verplaatst, zodat het schema op de abonnee geen subset van het schema in Publisher is, is SQL Server 2019 Integration Services (SSIS) de aanbevolen oplossing. Zie SQL Server Integration Servicesvoor meer informatie.

  • Als u schemawijzigingen aanbrengt in een gepubliceerde tabel, moeten de aangepaste procedures opnieuw worden gegenereerd. Zie Aangepaste transactionele procedures opnieuw genereren om schemawijzigingen weer te gevenvoor meer informatie.

  • Als u een waarde gebruikt die groter is dan 1 voor -SubscriptionStreams parameter van de distributieagent, moet u ervoor zorgen dat updates voor kolommen met primaire sleutels zijn geslaagd. Bijvoorbeeld:

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

    Als de distributieagent meer dan één verbinding gebruikt, kunnen deze twee updates worden gerepliceerd via verschillende verbindingen. Als update 1 eerst wordt toegepast, is er geen probleem; als update 2 eerst wordt toegepast, wordt het bericht '0 rijen verwerkt' geretourneerd omdat update 1 nog niet heeft plaatsgevonden. Deze situatie wordt verwerkt in de standaardprocedures door een fout te genereren als er geen rijen worden beïnvloed bij een update:

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

    Door de fout op te laten treden, wordt de distributie-agent gedwongen om de updates opnieuw via één enkele verbinding uit te voeren, hetgeen zal slagen. Aangepaste opgeslagen procedures moeten vergelijkbare logica bevatten.

Oproepsyntaxis voor opgeslagen procedures

Er zijn vijf opties voor de syntaxis die wordt gebruikt om de procedures aan te roepen die worden gebruikt door transactionele replicatie:

  • CALL-syntaxis. Kan worden gebruikt voor invoegingen, updates en verwijderingen. Bij replicatie wordt deze syntaxis standaard gebruikt voor invoegingen en verwijderingen.

  • SCALL-syntaxis. Kan alleen worden gebruikt voor updates. Bij replicatie wordt deze syntaxis standaard gebruikt voor updates.

  • MCALL-syntaxis. Kan alleen worden gebruikt voor updates.

  • XCALL-syntaxis. Kan worden gebruikt voor updates en verwijderingen.

  • VCALL. Wordt gebruikt voor bij te werken abonnementen. Alleen intern gebruik.

Elke methode verschilt in de hoeveelheid gegevens die wordt doorgegeven aan de abonnee. SCALL geeft bijvoorbeeld alleen waarden door voor de kolommen die daadwerkelijk worden beïnvloed door een update. XCALL vereist daarentegen alle kolommen (al dan niet beïnvloed door een update) en alle oude gegevenswaarden voor elke kolom. In veel gevallen is SCALL geschikt voor updates, maar als voor uw toepassing alle gegevenswaarden tijdens een update zijn vereist, maakt XCALL dit mogelijk.

Oproep syntaxis

Opgeslagen procedures toevoegen
Opgeslagen procedures die INSERT-instructies verwerken, zullen de waarden ontvangen die voor alle kolommen zijn ingevoegd.

c1, c2, c3,... cn  

Opgeslagen procedures bijwerken
Opgeslagen procedures voor het verwerken van UPDATE-instructies ontvangen de bijgewerkte waarden voor alle kolommen die erin zijn gedefinieerd, gevolgd door de oorspronkelijke waarden voor de primaire sleutelkolommen (er wordt geen poging gedaan om te bepalen welke kolommen zijn gewijzigd.):

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

Opgeslagen procedures verwijderen
Opgeslagen procedures die DELETE-instructies afhandelen, krijgen waarden door voor de primaire sleutelkolommen.

pkc1, pkc2, pkc3,... pkcn  

SCALL-syntaxis

Bijgewerkte opgeslagen procedures
Opgeslagen procedures die UPDATE-instructies verwerken, zullen alleen de bijgewerkte waarden ontvangen voor de kolommen die zijn gewijzigd, gevolgd door de oorspronkelijke waarden voor de kolommen van de primaire sleutel, en vervolgens een bitmasker (binary(n)) parameter die de gewijzigde kolommen aangeeft. In het volgende voorbeeld is kolom 2 (c2) niet gewijzigd:

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

MCALL-syntaxis

Opgeslagen procedures bijwerken
Opgeslagen procedures voor het verwerken van UPDATE-instructies ontvangen de bijgewerkte waarden voor alle kolommen die in het artikel zijn gedefinieerd, gevolgd door de oorspronkelijke waarden voor de primaire-sleutelkolommen, en vervolgens een bitmasker (binair(n)) parameters die de gewijzigde kolommen aangeven:

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

XCALL-syntaxis

Bijwerken opgeslagen procedures
Opgeslagen procedures voor het verwerken van UPDATE-instructies ontvangen de oorspronkelijke waarden (de voorafbeelding) voor alle kolommen die in het artikel zijn gedefinieerd, gevolgd door de bijgewerkte waarden (de na-afbeelding) voor diezelfde kolommen.

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

VERWIJDER opgeslagen procedures
Opgeslagen procedures krijgen bij het verwerken van DELETE-instructies de oorspronkelijke waarden (de voorafbeeldingen) doorgegeven voor alle kolommen die in het artikel zijn gedefinieerd.

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

Notitie

Wanneer u XCALL gebruikt, worden de vóór-waarden van de kolommen tekst en afbeelding naar verwachting als NULL beschouwd.

Voorbeelden

De volgende procedures zijn de standaardprocedures die zijn gemaakt voor de Vendor Table in de voorbeelddatabase Adventure Works.

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