FIX: Messaggio di errore quando si tenta di inserire dati in un server di sottoscrizione di una replica di tipo merge in SQL Server 2005: "messaggi 548, livello 16, stato 2, riga 1. L'inserimento non riuscita"

Traduzione articoli Traduzione articoli
Identificativo articolo: 953481 - Visualizza i prodotti a cui si riferisce l?articolo.
Bug #: 50002854 (SQL Hotfix)
Microsoft distribuisce le correzioni di Microsoft SQL Server 2005 come un unico file scaricabile. PoichÚ le correzioni sono cumulative, ogni nuova versione contiene tutti gli aggiornamenti rapidi e tutte le correzioni protezione rilasciate con SQL Server 2005 precedente versione di correzione.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Si consideri lo scenario seguente. In SQL Server 2005, Ŕ possibile configurare una pubblicazione di tipo merge. ╚ aggiungere una tabella contenente una colonna di identitÓ per la pubblicazione di tipo merge. ╚ quindi inserire dati nella tabella nel server di pubblicazione. ╚ sincronizzare i dati tra il server di sottoscrizione e il server di pubblicazione, e quindi si tenta di inserire ulteriori dati nel server di pubblicazione. In questo scenario, il seguente messaggio di errore nel server di pubblicazione:
Msg 548, livello 16, 2, stato 1
L'inserimento non riuscita. In conflitto con un'identitÓ intervallo selezionare vincolo nel database ' DatabaseName ', tabella replicata ' Schema. TableName ', ' ColumnName ' colonna. Se la colonna identity Ŕ gestita automaticamente dal processo di replica, l'aggiornamento dell'intervallo come indicato di seguito: per il server di pubblicazione, eseguire sp_adjustpublisheridentityrange; per server di sottoscrizione, eseguire l'agente di distribuzione o l'agente di merge.
Se si tenta di eseguire il sp_adjustpublisheridentityrange stored procedure nel server di pubblicazione come indicato nel messaggio di errore, non Ŕ ancora possibile risolvere il problema.

Questo problema si verifica quando pi¨ agenti di merge sincronizza i dati allo stesso tempo per la stessa pubblicazione di unione. Questo problema pu˛ essere aggravato se hai il numero di sottoscrittori della pubblicazione di stampa unione.

Cause

Questo problema si verifica perchÚ il valore identity corrente della tabella nel server di pubblicazione non Ŕ nell'intervallo di vincolo di controllo di intervallo identitÓ identitÓ. Questo comportamento si verifica quando pi¨ agenti di merge tenta di aumentare l'intervallo di identitÓ allo stesso tempo creando il successivo intervallo di identitÓ nel server di pubblicazione.

Risoluzione

La correzione di questo problema Ŕ stata rilasciata prima nell'aggiornamento cumulativo 8. Per ulteriori informazioni su come ottenere il pacchetto di aggiornamento cumulativo per SQL Server 2005 Service Pack 2, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
951217Pacchetto di aggiornamento cumulativo 8 per SQL Server 2005 Service Pack 2
Nota PoichÚ le generazioni sono cumulative, ogni nuova versione di correzione contiene tutti gli aggiornamenti rapidi e tutte le correzioni protezione rilasciate con SQL Server 2005 precedente versione di correzione. Microsoft consiglia di considerare applicare la correzione rapida per la versione pi¨ recente che contiene questo aggiornamento rapido (hotfix). Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
937137Versioni di SQL Server 2005 rilasciate dopo il rilascio di SQL Server 2005 Service Pack 2
Gli hotfix di Microsoft SQL Server 2005 vengono creati per service pack specifici di SQL Server. ╚ necessario applicare un hotfix di SQL Server 2005 Service Pack 2 a un'installazione di SQL Server 2005 Service Pack 2. Per impostazione predefinita, qualsiasi hotfix fornito in un service pack di SQL Server Ŕ incluso nel successivo service pack SQL Server.

Workaround

Per aggirare il problema, Ŕ necessario impedire pi¨ le sincronizzazioni di merge concorrenti. Per effettuare questa operazione, impostare la proprietÓ max_concurrent_merge pubblicazione di tipo merge eseguendo la seguente istruzione:
sp_changemergepublication '<PublicationName>', 'max_concurrent_merge', 1
Nota dopo utilizzare questa soluzione alternativa, le prestazioni potrebbero diminuire in presenza di molti server di sottoscrizione per la pubblicazione. Questo comportamento si verifica perchÚ solo un sottoscrittore pu˛ sincronizzare i dati alla volta.

Status

Microsoft ha confermato che questo problema riguarda i prodotti sono elencati nella sezione "Si applica a".

Informazioni

Come determinare se si sta verificando questo problema

Per determinare se si sta verificando questo problema, attenersi alla seguente procedura:
  1. Verificare che il valore identity corrente sia minore del limite inferiore del primo intervallo di identitÓ del vincolo di identitÓ intervallo controllo.

    Per ottenere il valore identity corrente, eseguire la seguente istruzione:
    SELECT IDENT_CURRENT ('<TableName>')
    per ottenere gli intervalli del vincolo check identitÓ intervallo di valori identity, eseguire una delle seguenti istruzioni:
    Istruzione 1
    sp_helpconstraint '<TableName>'
    Istruzione 2
    select * from MSmerge_identity_range
    where is_pub_range <>1
    AND artid IN 
     (select artid from sysmergearticles where name='<TableName>')
    AND subid in 
     (select subid from sysmergesubscriptions  MS
    join sysmergepublications MP 
    on MS.subscriber_server=MP.publisher
    AND MS.db_name = MP.publisher_db
    WHERE name='<PublicationName>'
    )
    
  2. Consente di utilizzare una traccia di SQL Server Profiler per determinare se con interfoliazione esecuzioni della procedura sp_MSsetup_publisher_idrange archiviati vengono avviati mediante separate sessioni dell'agente di merge per la stessa pubblicazione.

    Tuttavia, con interfoliazione esecuzioni della procedura sp_MSsetup_publisher_idrange archiviati non sempre indicano che questo problema si verifica. Infatti, SQL Server Profiler non era in esecuzione quando l'occorrenza originale della sincronizzazione di tipo merge generato il primo messaggio di errore. Tuttavia, con interfoliazione esecuzioni della procedura sp_MSsetup_publisher_idrange memorizzato aumentare la possibilitÓ di verifica questo problema.
  3. ╚ possibile trovare sovrapposte sincronizzazioni di unione che si verificano quando viene visualizzato che il messaggio di errore "548" viene visualizzato. Per effettuare questa operazione, Ŕ possibile esaminare la cronologia di unione nel database di distribuzione. A tale scopo, eseguire le seguenti istruzioni: max(time)
    Use distribution
    GO
    select session_id, agent_id, B.publication, min(time) as StartTime, max(time) as EndTime
    into #sessiontimes
    from dbo.MSmerge_history A
    join dbo.msmerge_agents B
    on A.agent_id = B.id
    group by session_id, agent_id, publication
    order by 3 desc
    GO
    -- The left side result is the original session. The right side result is the overlapping session.
    select A.*, B.* 
    from #sessiontimes A
    Join #sessiontimes B
    On B.StartTime >= A.StartTime
    AND B.StartTime <= A.EndTime
    AND A.session_id <> B.session_id
    And A.publication=B.publication
    Order By A.StartTime asc
    GO
    drop table #sessiontimes
    

Come correggere esistente danneggiato intervalli identity per una tabella problematica

Dopo avere installato l'aggiornamento cumulativo o dopo avere utilizzato il metodo Ŕ descritto nella sezione soluzione, un intervallo di identitÓ danneggiato esistente in una tabella non corretto. Continuerai a ricevere il messaggio di errore "548" Se si tenta di inserire dati nella tabella e sincronizzare i dati in un server di sottoscrizione. Di conseguenza, Ŕ necessario correggere manualmente gli intervalli di identitÓ danneggiato per la tabella. Per effettuare questa operazione, attenersi alla seguente procedura.

Nota Questi passaggi comportano manualmente sottoposto a override il valore di inizializzazione identity corrente per la tabella reinizializzare correttamente il valore identity nel server di pubblicazione. Nello stato danneggiato, il valore identity corrente Ŕ inferiore al primo intervallo identitÓ nel vincolo di controllo di tipo merge replica identitÓ intervallo. La procedura aumentare manualmente il valore identity a scendere all'interno dell'intervallo identitÓ definita dal vincolo check di intervallo di unione replica identitÓ. Questa procedura presuppone che l'identitÓ siano configurate in modo crescente e che l'incremento di identitÓ sia configurato per incrementare un valore pari a 1.
  1. Verificare che il valore di incremento di identitÓ Ŕ 1 e che l'identitÓ procede in modo di crescente. Per ottenere il valore di incremento di identitÓ Ŕ possibile eseguire l'istruzione seguente nel server di pubblicazione:
    SELECT IDENT_INCR( '<TableName>')
  2. Eseguire l'istruzione seguente nel server di pubblicazione per trovare il valore identity corrente sulla colonna identity problematici:
    DBCC CHECKIDENT ('<TableName>')
    dopo viene visualizzato il risultato, nota il valore del valore identity corrente per il confronto nella procedura successiva. Si noti che valye il valore della colonna corrente potrebbe essere maggiore o minore del valore del valore identity corrente .

    Se il valore del valore della colonna corrente Ŕ maggiore del valore del valore identity corrente , il valore della colonna pu˛ avere ha avuto origine in altre repliche della topologia di e unito correttamente la replica di server di pubblicazione. Se il valore di valore colonna corrente Ŕ minore del valore del valore identity corrente , i valori Ŕ possibile che sia stati inseriti nel server di pubblicazione in un momento precedente da utilizzando SET IDENTITY_INSERT ON istruzione prima la configurazione della replica di unione.
  3. Eseguire le istruzioni seguenti nel server di pubblicazione per determinare gli intervalli di identitÓ corrente dell'intervallo di identitÓ selezionare vincolo per la tabella problematica:
    Use <PublishedDatabaseName>
    GO
    sp_helpconstraint '<TableName>'
    GO
    
    dopo avere ricevuto il risultato, annotare il valore della colonna constraint_keys del record dove il valore della colonna constraint_name Ŕ "repl_identity_range_ GUID. Il valore GUID corrisponde al valore della colonna article_id per l'articolo nella tabella di sistema sysmergearticles. Per ottenere il GUID, eseguire la seguente istruzione:
    select artid from sysmergearticles where name = '<TableName>'
    il vincolo check di identitÓ intervallo si estende su due distinti intervalli. I due insiemi di intervalli non sono necessario essere adiacenti. Ad esempio, il valore della colonna constraint_keys pu˛ essere come segue:
    ([NomeColonna] > (1001) AND [ColumnName]<=(2001)
    OR [NomeColonna] > (9001) AND [ColumnName]<=(10001))
    Nota Questo articolo, in questo esempio viene utilizzato per presentare il codice nel resto della procedura.

    In questo esempio, gli intervalli si estendono 1.000 valori. 1.000 Ŕ la dimensione di intervallo di predefinito. Tuttavia, Ŕ possibile modificare le dimensioni dell'intervallo identitÓ utilizzando uno dei metodi descritti di seguito:
    • Specificare il @ pub_identity_range parametro quando si esegue la stored procedure sp_addmergearticle stored procedure.
    • Modificare la proprietÓ Dimensioni intervallo server di sottoscrizione per l'articolo nella finestra di dialogo ProprietÓ articolo .
  4. Se si verifica il problema Ŕ descritto nella sezione "Sintomi", il valore identity corrente annotato nel passaggio 2 deve essere inferiore rispetto al limite inferiore dell'intervallo identitÓ primo del vincolo di identitÓ intervallo controllo annotato nel passaggio 3.

    Se il valore identity corrente nel passaggio 2 Ŕ maggiore del limite superiore dell'intervallo di identitÓ secondo dell'intervallo di identitÓ del vincolo check, risolvere il problema utilizzando il metodo consigliato nel messaggio di errore. Pertanto, Ŕ consigliabile eseguire la procedura sp_adjustpublisheridentityrange memorizzati nel server di pubblicazione.

    Per ulteriori informazioni sulla procedura sp_adjustpublisheridentityrange memorizzati, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
    http://msdn.microsoft.com/en-us/library/ms181527.aspx
  5. Eseguire l'istruzione seguente per determinare se le righe sono negli intervalli del vincolo di identitÓ intervallo controllo identitÓ corrente:
    SELECT COUNT(*) FROM TableName WHERE 
    ([ColumnName]>(1001) AND [ColumnName]<=(2001) 
    OR [ColumnName]>(9001) AND [ColumnName]<=(10001))
    
    note
    • Se l'istruzione restituisce 0, non righe sono negli intervalli identitÓ corrente. In questo caso, passare il passaggio 6.
    • Se l'istruzione restituisce un valore maggiore di 0, eseguire l'istruzione seguente per ottenere il valore identity massimo negli intervalli identitÓ corrente:
      SELECT MAX(ColumnName) as MaxValue FROM TableName WHERE 
      ([ColumnName]>(1001) AND [ColumnName]<=(2001) OR 
      [ColumnName]>(9001) AND [ColumnName]<=(10001))
      
      prendere nota del valore restituito e procedere al passaggio 7.
  6. Reinizializzare manualmente l'identitÓ corrente per la tabella problematica per rientrano all'interno di un intervallo valido.

    Reinizializzare l'identitÓ corrente al valore pi¨ basso degli intervalli di identitÓ corrente + 1. Ad esempio, se il valore pi¨ basso degli intervalli di identitÓ corrente Ŕ 1001, il primo valore in intervallo possibile Ŕ 1002, poichÚ la fine dell'intervallo del vincolo di identitÓ intervallo controllo bassa utilizza il simbolo di maggiore (>) di segno. Per effettuare questa operazione, eseguire la seguente istruzione nel server di pubblicazione e quindi andare al passaggio 8:
    DBCC CHECKIDENT ('TableName', RESEED, 1002)
  7. Reinizializzare manualmente l'identitÓ corrente per la tabella problematica per rientrano all'interno di un intervallo valido.

    Si supponga che l'incremento di identitÓ sia 1. Reinizializzare l'identitÓ corrente sul valore annotato nel passaggio 5 e quindi aggiungere 1. Ad esempio, se il valore annotato nel passaggio 5 Ŕ 1507, reinizializzare l'identitÓ corrente per 1508. A tale scopo, eseguire la seguente istruzione nel server di pubblicazione:
    DBCC CHECKIDENT ('TableName', RESEED, 1508)
  8. Consente di eseguire un test per determinare se senza errore 548 verifica Ŕ possibile inserire nuove righe nella tabella di database di pubblicazione.
Per ulteriori informazioni su quali file vengono modificati e per informazioni sui prerequisiti richiesti per applicare il pacchetto di aggiornamento cumulativo contenente l'hotfix descritto in questo articolo della Microsoft Knowledge Base, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
951217Pacchetto di aggiornamento cumulativo 8 per SQL Server 2005 Service Pack 2

Riferimenti

Per ulteriori informazioni sull'elenco delle generazioni disponibili dopo SQL Server Service Pack 2, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
937137Versioni di SQL Server 2005 rilasciate dopo il rilascio di SQL Server 2005 Service Pack 2
Per ulteriori informazioni sul modello di manutenzione incrementale per SQL Server, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
935897Un modello di manutenzione incrementale Ŕ disponibile dal team di SQL Server per fornire aggiornamenti rapidi per i problemi segnalati
Per ulteriori informazioni su come ottenere SQL Server 2005 Service Pack 2, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
913089Come ottenere il service pack pi¨ recente per SQL Server 2005
Per ulteriori informazioni sulle nuove funzionalitÓ e i miglioramenti apportati a SQL Server 2005 Service Pack 2, visitare il sito di Web di Microsoft:
http://go.microsoft.com/fwlink/?LinkId=71711
Per informazioni sulla schema di denominazione per SQL Server gli aggiornamenti, fare clic numero articolo riportato per visualizzare l'articolo della Microsoft Knowledge Base riportato di seguito:
822499Nuovo schema di denominazione per i pacchetti di aggiornamento software di Microsoft SQL Server
Per ulteriori informazioni sulla terminologia di aggiornamento software, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
824684Descrizione della terminologia standard utilizzata per descrivere gli aggiornamenti software Microsoft

ProprietÓ

Identificativo articolo: 953481 - Ultima modifica: venerdý 11 luglio 2008 - Revisione: 1.0
Le informazioni in questo articolo si applicano a:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Workgroup Edition
Chiavi:á
kbmt kbhotfixrollup kbfix kbpubtypekc kbqfe kbexpertiseadvanced kbhotfixserver kbautohotfix kbsql2005repl KB953481 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 953481
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com