CORRECÇÃO: Mensagem de erro ao tentar inserir dados em um assinante de replicação de mesclagem no SQL Server 2005: "mensagem 548, nível 16, estado 2, linha 1. A inserção falhou"

Traduções deste artigo Traduções deste artigo
ID do artigo: 953481 - Exibir os produtos aos quais esse artigo se aplica.
Bug #: 50002854 (Hotfix do SQL)
A Microsoft distribui correções do Microsoft SQL Server 2005 como um arquivo para download. Como as correções são cumulativas, cada versão nova contém todos os hotfixes e todos os as correções de segurança que foram incluídas com o anterior SQL Server 2005 corrigir lançamento.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Considere o seguinte cenário. No SQL Server 2005, você configura uma publicação de mesclagem. Adicionar uma tabela que contém uma coluna de identidade para a publicação de mesclagem. Em seguida, você inserir dados na tabela no Editor. Sincronizar os dados entre o assinante e o publisher e, em seguida, tentar inserir dados adicionais no Editor. Nesse cenário, você receber a seguinte mensagem de erro no Editor:
Msg 548, nível 16, estado 2, linha 1
A inserção de falha. Ele está em conflito com uma identidade intervalo verificar restrição no banco de dados ' DatabaseName ', tabela replicada ' Schema. TableName ', ' ColumnName ' coluna. Se a coluna de identidade é automaticamente gerenciada pela replicação, atualizar o intervalo da seguinte maneira: para o Publisher, execute sp_adjustpublisheridentityrange; para o assinante, execute o Distribution Agent ou o Merge Agent.
Se você tentar executar o sp_adjustpublisheridentityrange procedimento armazenado no editor como mencionado na mensagem de erro, você ainda não é possível resolver esse problema.

Esse problema ocorre quando vários agentes de mesclagem sincronizar dados ao mesmo tempo para a mesma publicação de mesclagem. Esse problema pode ser exacerbado se você tiver vários assinantes a publicação de mesclagem.

Causa

Esse problema ocorre porque o valor de identidade atual da tabela no editor não está dentro do intervalo de identidade da restrição de verificação de intervalo de identidade. Esse comportamento ocorre quando vários agentes Merge tenta aumente o intervalo de identidade ao mesmo tempo criando o próximo intervalo de identidade no Editor.

Resolução

A correção para esse problema foi lançada pela primeira vez na atualização cumulativa 8. Para obter mais informações sobre como obter esse pacote de atualizações cumulativas para o SQL Server 2005 Service Pack 2, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
951217Pacote de atualização cumulativo 8 para SQL Server 2005 Service Pack 2
Observação Como as compilações são cumulativas, cada novo lançamento de correções contém todos os hotfixes e todas as correções de segurança foram incluídas com o anterior SQL Server 2005 corrigir lançamento. A Microsoft recomenda que você considere a aplicação a versão de correção mais recente que contém esse hotfix. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
937137Compilações do SQL Server 2005 lançados após o SQL Server 2005 Service Pack 2 foi lançado
Os hotfixes do Microsoft SQL Server 2005 são criados para service packs do SQL Server específicos. Você deve aplicar um hotfix do SQL Server 2005 Service Pack 2 para uma instalação do SQL Server 2005 Service Pack 2. Por padrão, qualquer hotfix fornecidas em um SQL Server service pack está incluído no service pack seguinte do SQL Server.

Como Contornar

Para contornar esse problema, você deve evitar várias sincronizações de mesclagem simultâneas. Para fazer isso, defina a propriedade max_concurrent_merge na publicação de mesclagem executando a instrução a seguir:
sp_changemergepublication '<PublicationName>', 'max_concurrent_merge', 1
Observação após usar essa solução alternativa, o desempenho pode diminuir se você tiver vários assinantes para a publicação. Esse comportamento ocorre porque apenas um assinante pode sincronizar dados em uma hora.

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".

Mais Informações

Como determinar se você está enfrentando esse problema

Para determinar se você está enfrentando esse problema, execute as seguintes etapas:
  1. Verifique se o valor de identidade atual é menor do que o limite inferior do primeiro intervalo de identidade de restrição de seleção de intervalo de identidade.

    Para obter o valor de identidade atual, execute a instrução a seguir:
    SELECT IDENT_CURRENT ('<TableName>')
    para obter os intervalos de identidade de restrição de seleção de intervalo de identidade, execute qualquer uma das seguintes instruções:
    Instrução 1
    sp_helpconstraint '<TableName>'
    Instrução 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. Use um rastreamento do SQL Server Profiler para determinar se intercalado execuções do procedimento armazenado sp_MSsetup_publisher_idrange são iniciadas por sessões separadas do Merge Agent para a mesma publicação.

    No entanto, intercaladas execuções do procedimento armazenado sp_MSsetup_publisher_idrange não indicam sempre que apresentarem esse problema. Isso ocorre porque o SQL Server Profiler não estava sendo executado quando a ocorrência original da sincronização de mesclagem gerou a primeira mensagem de erro. No entanto, intercaladas execuções do procedimento armazenado sp_MSsetup_publisher_idrange aumentar a possibilidade de enfrentando esse problema.
  3. Você pode encontrar sobrepostos sincronizações de mesclagem que ocorrem quando você receber que a mensagem de erro "548" ocorre. Para fazer isso, você pode analisar o histórico de mesclagem no banco de dados de distribuição. Para fazer isso, execute as seguintes instruções: 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
    

Como corrigir existente danificado intervalos de identidade para uma tabela problemático

Depois que você instale a atualização cumulativa ou depois de usar o método que é descrito na seção solução alternativa, um intervalo de identidade danificado existente em uma tabela não for corrigido. Você ainda receberá a mensagem de erro "548" Se você tentar inserir dados na tabela e sincronizar dados em um assinante. Portanto, você deve corrigir manualmente os intervalos de identidade danificado para a tabela. Para fazer isso, siga estas etapas.

Observação Essas etapas envolvem manualmente substituindo o valor de semente de identidade atual para a tabela a corretamente propagar novamente o valor de identidade no Editor. No estado danificado, o valor de identidade atual for menor do que o primeiro intervalo de identidade na restrição de seleção de intervalo de mesclagem replicação identidade. As etapas manualmente aumentam o valor de identidade para caem dentro o intervalo de identidade que é definido por de mesclagem de replicação intervalo seleção restrição de identidade. Essas etapas pressupõem que identidades são configuradas de forma crescente e que o incremento de identidade é configurado para aumentar um valor de 1.
  1. Confirme que o valor de incremento de identidade é 1 e que a identidade continua em crescente maneira. Você pode obter o valor de incremento de identidade executando a instrução a seguir no Editor:
    SELECT IDENT_INCR( '<TableName>')
  2. Execute a seguinte instrução no Editor para localizar o valor de identidade atual na coluna de identidade problemático:
    DBCC CHECKIDENT ('<TableName>')
    após receber o resultado, anote o valor valor de identidade atual para comparação em etapas posteriores. Observe que o valor da coluna atual valye pode ser maior ou menor do que o valor do valor de identidade atual .

    Se o valor do valor da coluna atual for maior do que o valor de identidade atual , o valor da coluna pode ter se originou em outras duplicações na topologia e mesclado com êxito com a replicação do publisher. Se o valor do valor da coluna atual for menor que o valor de identidade atual , os valores podem foram inseridos no Editor em um momento anterior usando SET IDENTITY_INSERT ON instrução antes da configuração de replicação de mesclagem.
  3. Execute as seguintes instruções no Editor para determinar os intervalos de identidade atual do intervalo de identidade verificar restrição para a tabela problemática:
    Use <PublishedDatabaseName>
    GO
    sp_helpconstraint '<TableName>'
    GO
    
    após receber o resultado, observe o valor da coluna constraint_keys do registro onde o valor da coluna constraint_name é "repl_identity_range_ GUID. O valor GUID corresponde ao valor da coluna artid para o artigo na tabela de sistema sysmergearticles. Para obter o GUID, execute a instrução a seguir:
    select artid from sysmergearticles where name = '<TableName>'
    a restrição de verificação de intervalo de identidade abrange dois intervalos separados. Os dois conjuntos de intervalos não precisa ser contíguo. Por exemplo, o valor da coluna constraint_keys pode ser da seguinte maneira:
    ([ColumnName] > (1001) E [ColumnName]<=(2001)
    OU [ColumnName] > (9001) E [ColumnName]<=(10001))
    Observação Este artigo usa este exemplo para apresentar o código no restante das etapas.

    Neste exemplo, os intervalos se estender por 1.000 valores. 1.000 é o tamanho de intervalo padrão. No entanto, você pode alterar o tamanho do intervalo de identidade usando um dos seguintes métodos:
    • Especificar @ pub_identity_range parâmetro quando você executa o sp_addmergearticle procedimento armazenado.
    • Altere a propriedade tamanho do intervalo de assinante para o artigo na caixa de diálogo Propriedades do artigo .
  4. Se você enfrentar o problema descrito na seção "Sintomas", o valor de identidade atual que você anotou na etapa 2 deve ser menor que o limite inferior do primeiro intervalo de identidade da restrição de verificação de intervalo de identidade que você anotou na etapa 3.

    Se o valor de identidade atual na etapa 2 é maior do que o limite superior do segundo intervalo de identidade do intervalo de identidade de restrição de verificação, resolver o problema usando o método é recomendado na mensagem de erro. Portanto, você deve executar o procedimento sp_adjustpublisheridentityrange armazenados no Editor.

    Para obter mais informações sobre o procedimento armazenado sp_adjustpublisheridentityrange, visite o seguinte site da Web Microsoft Developer Network (MSDN):
    http://msdn.microsoft.com/en-us/library/ms181527.aspx
  5. Executar a instrução a seguir para determinar se as linhas são nos intervalos de identidade atual da restrição de identidade intervalo seleção:
    SELECT COUNT(*) FROM TableName WHERE 
    ([ColumnName]>(1001) AND [ColumnName]<=(2001) 
    OR [ColumnName]>(9001) AND [ColumnName]<=(10001))
    
    anotações
    • Se a instrução retorna 0, nenhuma linha está em intervalos de identidade atual. Nesse caso, vá para a etapa 6.
    • Se a instrução retorna um valor maior que 0, execute a instrução a seguir para obter o valor máximo de identidade nos intervalos de identidade atual:
      SELECT MAX(ColumnName) as MaxValue FROM TableName WHERE 
      ([ColumnName]>(1001) AND [ColumnName]<=(2001) OR 
      [ColumnName]>(9001) AND [ColumnName]<=(10001))
      
      Observe o valor retornado e vá para a etapa 7.
  6. Manualmente propagar novamente a identidade atual para a tabela problemática cair dentro de um intervalo válido.

    Propagar novamente a identidade atual para o menor valor de intervalos de identidade atual mais 1. Por exemplo, se o valor mais baixo dos intervalos de identidade atual for 1001, o primeiro valor no intervalo possível é 1002 porque o final do intervalo da restrição de identidade intervalo seleção baixo usa o maior que (>) de sinal. Para fazer isso, execute a instrução a seguir no Editor e, em seguida, vá para a etapa 8:
    DBCC CHECKIDENT ('TableName', RESEED, 1002)
  7. Manualmente propagar novamente a identidade atual para a tabela problemática cair dentro de um intervalo válido.

    Presuma que o incremento de identidade é 1. Propagar novamente a identidade atual para o valor que você anotou na etapa 5 e, em seguida, adicione 1. Por exemplo, se o valor que você anotou na etapa 5 for 1507, propagar novamente a identidade atual para 1508. Para fazer isso, execute a instrução a seguir no Editor:
    DBCC CHECKIDENT ('TableName', RESEED, 1508)
  8. Execute um teste para determinar se novas linhas podem ser inseridas na tabela no banco de dados editor sem erro 548 ocorrendo.
Para mais informações sobre quais arquivos são alterados e para obter informações sobre quaisquer pré-requisitos para aplicar o pacote de atualização cumulativa que contém o hotfix descrito neste artigo, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
951217Pacote de atualização cumulativo 8 para SQL Server 2005 Service Pack 2

Referências

Para obter mais informações sobre a lista de compilações disponibilizadas após o SQL Server Service Pack 2, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
937137Compilações do SQL Server 2005 lançados após o SQL Server 2005 Service Pack 2 foi lançado
Para obter mais informações sobre o modelo incremental de serviços para o SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
935897Há um modelo incremental de serviços da equipe do SQL Server para fornecer hotfixes para problemas relatados
Para obter mais informações sobre como obter o SQL Server 2005 Service Pack 2, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
913089Como obter o service pack mais recente para o SQL Server 2005
Para obter mais informações sobre os novos recursos e os aprimoramentos no SQL Server 2005 Service Pack 2, visite o seguinte site:
http://go.microsoft.com/fwlink/?LinkId=71711
Para obter mais informações sobre o esquema para nomeação para SQL Server atualizações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
822499Novo esquema para nomeação para pacotes de atualização de software do Microsoft SQL Server
Para obter mais informações sobre terminologia de atualização de software, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
824684Descrição da terminologia padrão que é usada para descrever as atualizações de software

Propriedades

ID do artigo: 953481 - Última revisão: sexta-feira, 11 de julho de 2008 - Revisão: 1.0
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt kbhotfixrollup kbfix kbpubtypekc kbqfe kbexpertiseadvanced kbhotfixserver kbautohotfix kbsql2005repl KB953481 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 953481

Submeter comentários

 

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