gebeurtenis
31 mrt, 23 - 2 apr, 23
De grootste SQL-, Fabric- en Power BI-leerevenement. 31 maart – 2 april. Gebruik code FABINSIDER om $ 400 te besparen.
Zorg dat u zich vandaag nog registreertDeze browser wordt niet meer ondersteund.
Upgrade naar Microsoft Edge om te profiteren van de nieuwste functies, beveiligingsupdates en technische ondersteuning.
van toepassing op:SQL Server
Azure 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.
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.
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.
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.
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
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
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
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.
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
gebeurtenis
31 mrt, 23 - 2 apr, 23
De grootste SQL-, Fabric- en Power BI-leerevenement. 31 maart – 2 april. Gebruik code FABINSIDER om $ 400 te besparen.
Zorg dat u zich vandaag nog registreertTraining