Specificare la modalità di propagazione delle modifiche per gli articoli transazionaliTransactional Articles - Specify How Changes Are Propagated

La replica transazionale consente di specificare la modalità di propagazione delle modifiche dei dati dal server di pubblicazione ai Sottoscrittori.Transactional replication allows you to specify how data changes are propagated from the Publisher to Subscribers. Per ogni tabella pubblicata è possibile specificare una delle quattro modalità con cui ogni operazione (INSERT, UPDATE o DELETE) dovrebbe propagarsi al Sottoscrittore:For each published table, you can specify one of four ways that each operation (INSERT, UPDATE, or DELETE) should be propagated to the Subscriber:

  • Specificare che la replica transazionale deve inserire in uno script e in un secondo momento chiamare una stored procedure per propagare le modifiche ai Sottoscrittori (impostazione predefinita).Specify that transactional replication should script out and subsequently call a stored procedure to propagate changes to Subscribers (the default).

  • Specificare la necessità che la modifica si propaghi tramite un'istruzione INSERT, UPDATE o DELETE (impostazione predefinita per i Sottoscrittori in cui non è in esecuzione SQL ServerSQL Server ).Specify that the change should be propagated using an INSERT, UPDATE, or DELETE statement (the default for non- SQL ServerSQL Server Subscribers).

  • Specificare che è necessario utilizzare una stored procedure personalizzata.Specify that a custom stored procedure should be used.

  • Specificare che l'azione non deve essere eseguita in alcun Sottoscrittore.Specify that this action should not be performed at any Subscriber. In tal caso le transazioni non vengono replicate.Transactions of that type are not replicated.

    Per impostazione predefinita, la replica transazionale propaga le modifiche ai Sottoscrittori utilizzando un set di stored procedure installate in ogni Sottoscrittore.By default, transactional replication propagates changes to Subscribers through a set of stored procedures that are installed on each Subscriber. Quando in una tabella del server di pubblicazione ha luogo un inserimento, un aggiornamento o un'eliminazione, l'operazione viene convertita in una chiamata a una stored procedure nel Sottoscrittore.When an insert, update or delete occurs on a table at the Publisher, the operation is translated into a call to a stored procedure at the Subscriber. La stored procedure accetta parametri che eseguono il mapping alle colonne della tabella, consentendo a tali colonne di essere modificate nel Sottoscrittore.The stored procedure accepts parameters that map to the columns in the table, allowing those columns to be changed at the Subscriber.

    Per impostare il metodo di propagazione per la modifica dei dati negli articoli transazionali, vedere Impostazione del metodo di propagazione per le modifiche ai dati negli articoli transazionali.To set the propagation method for data changes to transactional articles, see Set the Propagation Method for Data Changes to Transactional Articles.

Stored procedure predefinite e personalizzateDefault and custom stored procedures

Le tre procedure che la replica crea per impostazione predefinita per ogni articolo di tabella sono:The three procedures that replication creates by default for each table article are:

  • sp_MSins_< NomeTabella >, per la gestione degli inserimenti.sp_MSins_< tablename >, which handles inserts.

  • sp_MSupd_< NomeTabella >, per la gestione degli aggiornamenti.sp_MSupd_< tablename >, which handles updates.

  • sp_MSdel_< NomeTabella >, per la gestione delle eliminazioni.sp_MSdel_< tablename >, which handles deletes.

    Il <tablename> utilizzato nella procedura dipende dalla modalità impiegata per aggiungere l'articolo alla pubblicazione e dal fatto che il database di sottoscrizione contenga una tabella con lo stesso nome, ma di un proprietario diverso.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.

    Ognuna di queste procedure può essere sostituita da una procedura personalizzata che viene specificata durante l'aggiunta di un articolo a una pubblicazione.Any of these procedures can be replaced with a custom procedure that you specify when adding an article to a publication. Le procedure personalizzate vengono utilizzate se un'applicazione richiede una logica personalizzata, ad esempio l'inserimento di dati in una tabella di controllo quando una riga viene aggiornata in un Sottoscrittore.Custom procedures are used if an application requires custom logic, such as inserting data into an audit table when a row is updated at a Subscriber. Per ulteriori informazioni sulla definizione di stored procedure personalizzate, vedere l'elenco delle procedure riportato sopra.For more information about specifying custom stored procedures, see the how to topics listed above.

    Se si specificano le procedure di replica predefinite o le procedure personalizzate, verrà anche specificata la sintassi di chiamata per ogni procedura. Se si utilizzano le procedure predefinite, la replica selezionerà i valori predefiniti.If you specify the default replication procedures or custom procedures, you also specify call syntax for each procedure (replication selects defaults if you use the default procedures). La sintassi di chiamata determina la struttura dei parametri forniti alla procedura e la quantità di informazioni inviate al Sottoscrittore a ogni modifica dei dati.The call syntax determines the structure of the parameters provided to the procedure and how much information is sent to the Subscriber with each data change. Per ulteriori informazioni, vedere la sezione "Sintassi di chiamata per le stored procedure" più avanti in questo argomento.For more information, see the section "Call Syntax for Stored Procedures" in this topic.

Considerazioni per l'utilizzo di stored procedure personalizzateConsiderations for Using Custom Stored Procedures

È bene tenere a mente le seguenti considerazioni quando si utilizzano stored procedure personalizzate:Keep the following considerations in mind when using custom stored procedures:

  • È necessario supportare la logica presente nella stored procedure. MicrosoftMicrosoft non fornisce il supporto per la logica personalizzata.You must support the logic in the stored procedure; MicrosoftMicrosoft does not provide support for custom logic.

  • Per evitare conflitti con le transazioni utilizzate dalla replica, non utilizzare le transazioni esplicite nelle procedure personalizzate.In order to avoid conflicts with the transactions used by replication, explicit transactions should not be used in custom procedures.

  • Lo schema nel Sottoscrittore è in genere identico allo schema nel server di pubblicazione, ma può essere anche un subset dello schema del server di pubblicazione se viene utilizzato il filtro delle colonne.The schema at the Subscriber is typically identical to the schema at the Publisher, but can also be a subset of the Publisher schema if column filtering is used. Tuttavia, se è necessario trasformare lo schema mentre i dati vengono spostati in modo che lo schema del Sottoscrittore non sia un subset dello schema nel server di pubblicazione, SQL Server 2017 Integration Services (SSIS)SQL Server 2017 Integration Services (SSIS) è la soluzione consigliata.However, if you need to transform the schema as the data is moved such that the schema on the Subscriber is not a subset of the schema on the Publisher, SQL Server 2017 Integration Services (SSIS)SQL Server 2017 Integration Services (SSIS) is the recommended solution. Per altre informazioni, vedere SQL Server Integration Services.For more information, see SQL Server Integration Services.

  • Se si apportano modifiche allo schema in una tabella pubblicata, è necessario rigenerare le procedure personalizzate.If you make schema changes to a published table, the custom procedures must be regenerated. Per altre informazioni, vedere Rigenerare procedure transazionali personalizzate per riflettere le modifiche dello schema.For more information, see Regenerate Custom Transactional Procedures to Reflect Schema Changes.

  • Se si usa un valore maggiore di 1 per il parametro -SubscriptionStreams dell'agente di distribuzione, sarà necessario verificare che vengano completati gli aggiornamenti alle colonne chiave primaria.If you use a value greater than 1 for -SubscriptionStreams parameter of the Distribution Agent, you must ensure that updates to primary key columns are successful. Esempio:For example:

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

    Se l'agente di distribuzione utilizza più di una connessione, questi due aggiornamenti potrebbero essere replicati su diverse connessioni.If the Distribution Agent uses more than one connection, these two updates might be replicated over different connections. Se l'aggiornamento 1 viene applicato per primo, non vi sono problemi; se l'aggiornamento 2 viene applicato per primo, restituirà "Righe interessate 0" in quanto l'aggiornamento 1 non ha ancora avuto luogo.If update 1 is applied first, there is no problem; if update 2 is applied first it will return '0 rows affected' because update 1 has not yet occurred. Questa situazione viene gestita nelle procedure predefinite con la generazione di un errore se nessuna riga è interessata da un aggiornamento:This situation is handled in the default procedures by raising an error if no rows are affected on an update:

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

    La generazione di un errore obbliga l'agente di distribuzione a riprovare il processo di aggiornamento su una singola connessione. Il processo verrà eseguito correttamente.Raising the error forces the Distribution Agent to retry the updates over a single connection, which will succeed. È necessario che le stored procedure personalizzate includano una logica simile.Custom stored procedures must include similar logic.

Sintassi di chiamata per le stored procedureCall syntax for stored procedures

Sono disponibili cinque opzioni per la sintassi che consente di chiamare le procedure utilizzate dalla replica transazionale:There are five options for the syntax used to call the procedures used by transactional replication:

  • Sintassi CALL.CALL syntax. Può essere utilizzata per gli inserimenti, gli aggiornamenti e le eliminazioni.Can be used for inserts, updates, and deletes. Per impostazione predefinita, la replica utilizza questa sintassi per gli inserimenti e le eliminazioni.By default, replication uses this syntax for inserts and deletes.

  • Sintassi SCALL.SCALL syntax. Può essere utilizzata solo per gli aggiornamenti.Can be used for updates only. Per impostazione predefinita, la replica utilizza questa sintassi per gli aggiornamenti.By default, replication uses this syntax for updates.

  • Sintassi MCALL.MCALL syntax. Può essere utilizzata solo per gli aggiornamenti.Can be used for updates only.

  • Sintassi XCALL.XCALL syntax. Può essere utilizzata per gli aggiornamenti e le eliminazioni.Can be used for updates and deletes.

  • VCALL.VCALL. Utilizzata per le sottoscrizioni aggiornabili.Used for updatable subscriptions. Solo per uso interno.Internal use only.

    Questi metodi si differenziano per la quantità di dati propagati al Sottoscrittore.Each method differs in the amount of data that is propagated to the Subscriber. Con la sintassi SCALL, ad esempio, vengono passati esclusivamente i valori delle colonne effettivamente interessate da un aggiornamento.For example, SCALL passes in values only for the columns that are actually affected by an update. Con la sintassi XCALL vengono invece passate tutte le colonne, interessate o meno da un aggiornamento, e tutti i valori di dati precedenti per ogni colonna.XCALL, by contrast, requires all columns (whether affected by an update or not) and all the old data values for each column. In molti casi la sintassi appropriata per gli aggiornamenti è SCALL, ma se durante un aggiornamento l'applicazione in uso richiede tutti i valori di dati, è la sintassi XCALL a consentire che ciò avvenga.In many cases, SCALL is appropriate for updates, but if your application requires all the data values during an update, XCALL allows for this.

Sintassi CALLCALL Syntax

Stored procedure INSERTINSERT stored procedures
Alle stored procedure che gestiscono istruzioni INSERT vengono passati i valori inseriti per tutte le colonne:Stored procedures handling INSERT statements will be passed the inserted values for all columns:

c1, c2, c3,... cn  

Stored procedure UPDATEUPDATE stored procedures
Alle stored procedure che gestiscono istruzioni UPDATE vengono passati i valori aggiornati per tutte le colonne definite nell'articolo, seguiti dai valori originali per le colonne chiave primaria. Non viene effettuato alcun tentativo per determinare quali colonne siano state modificate:Stored procedures handling UPDATE statements will be passed the updated values for all columns defined in the article, followed by the original values for the primary key columns (no attempt is made to determine which columns were changed.):

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

Stored procedure DELETEDELETE stored procedures
Alle stored procedure che gestiscono istruzioni DELETE vengono passati i valori per le colonne chiave primaria:Stored procedures handling DELETE statements will be passed values for the primary key columns:

pkc1, pkc2, pkc3,... pkcn  

Sintassi SCALLSCALL Syntax

Stored procedure UPDATEUPDATE stored procedures
Alle stored procedure che gestiscono istruzioni UPDATE vengono passati i valori aggiornati solo per le colonne che sono state modificate, seguiti dai valori originali per le colonne di chiavi primarie e da un parametro di maschera di bit (binary(n)) che indica le colonne modificate.Stored procedures handling UPDATE statements will be passed the updated values only for those columns that have changed, followed by the original values for the primary key columns, followed by a bitmask (binary(n)) parameter that indicates the changed columns. Nell'esempio seguente la colonna 2 (c2) non è stata modificata:In the following example, column 2 (c2) has not changed:

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

Sintassi MCALLMCALL Syntax

Stored procedure UPDATEUPDATE stored procedures
Alle stored procedure che gestiscono istruzioni UPDATE vengono passati i valori aggiornati per tutte le colonne definite nell'articolo, seguiti dai valori originali per le colonne di chiavi primarie e da un parametro di maschera di bit (binary(n)) che indica le colonne modificate:Stored procedures handling UPDATE statements will be passed the updated values for all columns defined in the article, followed by the original values for the primary key columns, followed by a bitmask (binary(n)) parameter that indicates the changed columns:

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

Sintassi XCALLXCALL Syntax

Stored procedure UPDATEUPDATE stored procedures
Alle stored procedure che gestiscono istruzioni UPDATE vengono passati i valori originali, ovvero l'immagine precedente all'aggiornamento, per tutte le colonne definite nell'articolo, seguiti dai valori di aggiornamento, ovvero l'immagine successiva all'aggiornamento, per le stesse colonne:Stored procedures handling UPDATE statements will be passed the original values (the before image) for all columns defined in the article, followed by the updated values (the after image) for all columns defined in the article:

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

Stored procedure DELETEDELETE stored procedures
Alle stored procedure che gestiscono istruzioni DELETE vengono passati i valori originali, ovvero l'immagine precedente all'eliminazione, per tutte le colonne definite nell'articolo:Stored procedures handling DELETE statements will be passed the original (the before image) values for all columns defined in the article:

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

Nota

Quando si utilizza la sintassi XCALL, i valori dell'immagine precedente per le colonne di tipo text e image saranno NULL.When using XCALL, the before image values for text and image columns are expected to be NULL.

EsempiExamples

Le procedure che seguono sono le procedure predefinite create per la Vendor Table nel database di esempio di Adventure WorksAdventure Works .The following procedures are the default procedures created for the Vendor Table in the Adventure WorksAdventure Works sample database.

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

Vedere ancheSee Also

Article Options for Transactional ReplicationArticle Options for Transactional Replication