Errori da ignorare nella replica transazionale

Per la replica transazionale è possibile ignorare in due modi gli eventuali errori incontrati durante il processo di distribuzione:

  • Utilizzando il parametro -SkipErrors dell'agente di distribuzione che consente di ignorare gli errori di un certo tipo. Non viene eseguito il commit della transazione contenente l'errore, ma viene eseguito quello delle transazioni successive.

  • Utilizzando la stored procedure sp_setsubscriptionxactseqno, che consente di ignorare una o più transazioni che generano errori. Questa opzione non è disponibile per i Sottoscrittori non SQL Server.

Nota importanteImportante

Nell'elaborazione di replica tipica non dovrebbe essere necessario ignorare alcun errore. È consigliabile ignorare gli errori con cautela e solo se si conosce la natura e la causa della condizione di errore e il motivo per cui l'errore di una specifica transazione deve essere ignorato anziché risolto. Se le transazioni per cui viene eseguito il commit nel server di pubblicazione vengono ignorate nel Sottoscrittore, i due nodi non saranno completamente sincronizzati e questo potrebbe generare ulteriori errori.

Parametro -SkipErrors

Per impostazione predefinita, quando l'agente di distribuzione rileva un errore, viene interrotto. Se si utilizza il parametro -SkipErrors e si specificano gli errori previsti o gli errori che si desidera non interferiscano con il processo di replica, le informazioni sull'errore vengono registrate e l'agente non viene interrotto. Ad esempio, se si desidera specificare che l'agente di distribuzione deve registrare le violazioni di chiavi duplicate continuando però ad elaborare le transazioni successive, specificare che l'agente deve ignorare gli errori 2601 (Impossibile inserire la riga di chiave duplicata nell'oggetto '%.*ls' con indice univoco '%.*ls') e 2627 (Violazione del vincolo %ls '%.*ls'. Impossibile inserire la riga di chiave duplicata nell'oggetto '%.*ls'):

-SkipErrors 2601;2627

La modalità più comune per utilizzare il parametro -SkipErrors consiste nell'utilizzare il profilo dell'agente di distribuzione Continua in caso di errori di consistenza dei dati. In questo caso, l'agente di distribuzione ignora gli errori 2601, 2627 e 20598 (Impossibile trovare la riga nel Sottoscrittore durante l'applicazione del comando replicato). Per ulteriori informazioni, vedere Profili degli agenti di replica. Oltre a questo profilo predefinito, è possibile specificare il parametro in un profilo di agente creato o modificato o nella riga di comando. Per ulteriori informazioni, vedere:

Nota importanteImportante

Per impostazione predefinita, i trigger vengono eseguiti con l'opzione XACT_ABORT impostata su ON. Se l'istruzione di un trigger genera un errore mentre l'agente di distribuzione applica le modifiche al Sottoscrittore, l'intero batch di modifiche avrà esito negativo, invece della singola istruzione. In una replica transazionale, è possibile utilizzare il parametro -SkipErrors dell'agente di distribuzione per ignorare le istruzioni che generano errori. Se -SkipErrors viene utilizzato con l'opzione XACT_ABORT impostata su ON, se un'istruzione genera un errore viene ignorato l'intero batch di modifiche. A meno che non si richieda che l'opzione XACT_ABORT sia impostata su ON nei trigger, è consigliabile impostarla su OFF se si utilizza il parametro -SkipErrors. Per impostare tale opzione su OFF, specificare SET XACT_ABORT OFF nella definizione del trigger. Per ulteriori informazioni su XACT_ABORT, vedere SET XACT_ABORT (Transact-SQL).

Stored procedure sp_setsubscriptionxactseqno

È possibile utilizzare la stored procedure sp_setsubscriptionxactseqno, che consente di ignorare una o più transazioni che generano errori quando vengono applicate nel Sottoscrittore. Se è presente un errore e si desidera ignorare una o più transazioni:

  1. Eseguire sp_helpsubscriptionerrors nel server di distribuzione dopo l'interruzione dell'agente di distribuzione. Questa stored procedure restituisce la colonna xact_seqno, contenente il numero di sequenza del file di log (LSN) di ogni transazione non riuscita.

  2. Eseguire sp_setsubscriptionxactseqno specificando un valore per il parametro @xact_seqno. Se si desidera ignorare tutte le transazioni non riuscite, specificare l'LSN massimo restituito da sp_helpsubscriptionerrors.

Per ulteriori informazioni, vedere sp_setsubscriptionxactseqno (Transact-SQL) e sp_helpsubscriptionerrors (Transact-SQL).