Ho notato che quando si imposta una replica transazionale, SQL Server imposterà la gestione dell'intervallo di identità su manuale. Ciò significa che nel mio database di abbonamenti, quando provo a inserire un nuovo record in una tabella il cui PK è una colonna di identità, mi darà un errore e dirò che ha provato a inserire un PK di "1", "2 "," 3 ", ecc. Questo perché il valore di identità corrente per tutte le colonne di identità sull'abbonato viene reimpostato sul valore di seed (di solito 1) anziché rimanere su quello che era sull'editore.
Capisco perché SQL Server fa questo: dovresti lasciare la tabella degli abbonati in sola lettura. Tuttavia, il mio scenario è un po 'poco ortodosso: di tanto in tanto aggiorno il mio abbonato attraverso la replica, eseguo un backup immediato di quel DB, quindi voglio fare alcuni aggiornamenti al sottoscrittore che NON VERRANNO essere rispediti all'editore, quindi quando vado di nuovo ad aggiornare l'abbonato, ripristino il suo database dal backup precedente ed estraggo gli ultimi aggiornamenti. Dato che voglio fare aggiornamenti al sottoscrittore tra questi aggiornamenti ("delta temporanea" se vuoi), ho bisogno che la colonna identità funzioni e non resetta a 1 quando viene replicata.
Ho provato ad attivare la gestione automatica dell'intervallo di identità durante l'impostazione della mia pubblicazione, ma ciò mi dà il seguente errore quando provo ad aggiungere una tabella alla pubblicazione:
Messaggio 21231, livello 16, stato 1, procedura sp_MSrepl_addarticle, riga 2243 Il
supporto automatico dell'intervallo di identità è utile solo per le pubblicazioni che consentono l'aggiornamento degli abbonati.
C'è un modo per aggirare questo problema? Voglio presentare questa replica a SQL Server come se fosse di sola lettura alla fine dell'abbonato perché non intendo fare aggiornamenti che verranno restituiti al publisher , ma voglio fare aggiornamenti temporanei che verrà cancellato prima della replica successiva.
Ho anche considerato che la replica di snapshot potrebbe essere un metodo più appropriato rispetto alla replica transazionale per il mio modello di utilizzo, ma il problema è che la replica di snapshot richiede l'invio dell'intero darn DB ad ogni singolo aggiornamento; poiché sto pianificando di eseguire un backup immediato del DB dopo l'ultima replica, non dovrei aver bisogno di eseguire l'intero trasferimento ogni volta; solo i cambiamenti dall'ultima volta.
Is there any way I can get round this problem?
Devi impostare la colonna Identity come NOT FOR REPLICATION usando sys.sp_identitycolumnforreplication per SQL Server 2005 e versioni successive. Non è nemmeno necessario ripetere la ripresa degli articoli quando si cambia la colonna identità come non per la replica. Non farlo usando la GUI.