CORRECÇÃO: Mensagem de erro quando tenta inserir dados num subscritor de replicação de intercalação em SQL Server 2005: "erro 548, 16, estado 2, nível 1 de linhas. Falhou a inserção"

Traduções de Artigos Traduções de Artigos
Artigo: 953481 - Ver produtos para os quais este artigo se aplica.
N.º de bugs: 50002854 (correcção SQL)
A Microsoft distribui correcções Microsoft SQL Server 2005 como um ficheiro transferível. Uma vez que as correcções são cumulativas, cada nova versão contém todas as correcções e todas as correcções de segurança incluídas com o SQL Server 2005 anterior corrigir lançamento.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Considere o seguinte cenário. No SQL Server 2005, configurar uma publicação de impressão em série. Adicionar uma tabela que contém uma coluna de identidade à publicação de impressão em série. Em seguida, inserir dados na tabela no fabricante. Sincronize os dados entre o subscritor e o fabricante e, em seguida, tenta inserir dados adicionais sobre o fabricante. Neste cenário, receberá a seguinte mensagem de erro no Editor:
Msg nível 548, 16, estado 2, linha 1
Falhou a inserção. Entrou em conflito com uma identidade intervalo verificar restrição na base de dados ' DatabaseName ', tabela replicada ' Schema. TableName ', a coluna ' ColumnName '. Se a coluna de identidade automaticamente é gerida pela replicação, actualizar o intervalo da seguinte forma: para o Publisher, execute sp_adjustpublisheridentityrange; para o subscritor, execute o serviço de distribuição ou o agente de intercalação.
Se tentar executar o sp_adjustpublisheridentityrange procedimento armazenado no fabricante mencionado na mensagem de erro, não é possível resolver este problema.

Este problema ocorre quando múltiplas agentes de impressão em série sincronizar dados ao mesmo tempo para a mesma publicação de impressão em série. Este problema pode ser aumentado se tiver muitos aos subscritores que a publicação de impressão em série.

Causa

Este problema ocorre porque o valor da tabela o Editor de identidade actual não está no intervalo de identidade da restrição de verificação de intervalo de identidade. Este comportamento ocorre quando agentes de impressão em série vários tentar aumentar o intervalo de identidade ao mesmo tempo, criar o seguinte intervalo de identidade no fabricante.

Resolução

A correcção para este problema foi disponibilizada pela primeira vez na actualização cumulativa 8. Para obter mais informações sobre como obter este pacote de actualização cumulativa para o SQL Server 2005 Service Pack 2, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
951217Pacote de actualização cumulativa 8 para o SQL Server 2005 Service Pack 2
Nota Uma vez que as compilações são cumulativas, cada nova versão de correcção contém todas as correcções e todas as correcções de segurança incluídas com o SQL Server 2005 anterior corrigir lançamento. A Microsoft recomenda que considerar a aplicação a versão de correcção mais recente que contenha esta correcção. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
937137Cria o SQL Server 2005 que foram disponibilizadas após o lançamento do SQL Server 2005 Service Pack 2
As correcções Microsoft SQL Server 2005 são criadas para service packs do SQL Server específicos. Tem de aplicar uma correcção do SQL Server 2005 Service Pack 2 para uma instalação do SQL Server 2005 Service Pack 2. Por predefinição, qualquer correcção fornecida num service pack do SQL Server está incluída no próximo service pack do SQL Server.

Como contornar

Para contornar este problema, tem de evitar vários sincronizações de impressão em série em simultâneo. Para efectuar este procedimento, defina a propriedade max_concurrent_merge na publicação de impressão em série executando a instrução seguinte:
sp_changemergepublication '<PublicationName>', 'max_concurrent_merge', 1
Nota depois de usar esta solução alternativa, o desempenho pode diminuir se tiver muitos os subscritores da publicação. Este comportamento ocorre porque apenas um subscritor pode sincronizar dados cada vez.

Ponto Da Situação

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

Mais Informação

Como determinar se tem este problema

Para determinar se tem este problema, siga estes passos:
  1. Verifique se o valor actual de identidade é menor do que o limite inferior do primeiro intervalo de identidade da restrição de verificação de intervalo de identidade.

    Para obter o valor de identidade actual, execute a seguinte instrução:
    SELECT IDENT_CURRENT ('<TableName>')
    para obter os intervalos de identidade da restrição de verificação de intervalo de identidade, execute um dos 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. Utilize um rastreio de SQL Server Profiler para determinar se intercalado execuções do procedimento armazenado sp_MSsetup_publisher_idrange são iniciadas por separado sessões de serviço de impressão em série para a mesma publicação.

    No entanto, intercaladas execuções do procedimento armazenado sp_MSsetup_publisher_idrange não indicam sempre que tenham este problema. Isto deve-se ao facto de SQL Server Profiler não estava em execução quando a ocorrência original da sincronização intercalação gerado a primeira mensagem de erro. No entanto, intercaladas execuções do procedimento armazenado sp_MSsetup_publisher_idrange aumentar a possibilidade de a ter este problema.
  3. Pode encontrar sobrepostos sincronizações de intercalação que ocorrem quando receber que a mensagem de erro "548". Para efectuar este procedimento, pode rever o histórico de intercalação na base de dados distribuição. Para efectuar este procedimento, 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 existentes danificado intervalos de identidade para uma tabela problemático

Depois de instalar a actualização cumulativa, ou depois de utilizar o método descrito na secção solução alternativa, um intervalo de identidade danificado existente numa tabela não é corrigido. Ainda receberá a mensagem de erro "548" Se tentar inserir dados na tabela e sincronizar dados de um subscritor. Por conseguinte, tem de corrigir manualmente os intervalos de identidade danificado para a tabela. Para o fazer, siga estes passos.

Nota Estes passos envolvem substituir manualmente o valor de propagação identidade actual para a tabela a reseed correctamente o valor identidade no Editor. Estado danificado, o valor de identidade actual for menor que o primeiro intervalo de identidade na restrição de verificação de intervalo de intercalação replicação identidade. Os passos manualmente aumentar o valor de identidade para se encontrem dentro do intervalo de identidade é definido pela restrição de verificação a intercalação replicação identidade intervalo. Estes passos assumem que identidades estão configuradas de forma ascendente e que o incremento de identidade está configurado para aumentar um valor de 1.
  1. Confirme que o valor de incremento de identidade é 1 e que a identidade funciona de forma ascendente. É possível obter o valor de incremento de identidade, executar a seguinte instrução no fabricante:
    SELECT IDENT_INCR( '<TableName>')
  2. Executa a declaração seguinte no Editor para localizar o valor identidade actual na coluna de identidade problemáticas:
    DBCC CHECKIDENT ('<TableName>')
    depois de receber o resultado, anote o valor actual valor de identidade de comparação em passos posteriores. Repare que o valor da coluna actual valye pode ser maior ou menor que o valor de identidade actual .

    Se o valor de coluna actual for maior que o valor de identidade actual , o valor da coluna poderá ter origem em outras replicações na topologia e intercalados com êxito com a replicação do publisher. Se o valor de coluna actual for menor que o valor de identidade actual , os valores podem foram inseridos no Editor num momento anterior utilizando ON de IDENTITY_INSERT SET instrução antes da configuração de replicação de intercalação.
  3. Execute as instruções seguintes sobre o fabricante para determinar os intervalos de identidade actual do intervalo de identidade verificar restrição para a tabela problemática:
    Use <PublishedDatabaseName>
    GO
    sp_helpconstraint '<TableName>'
    GO
    
    depois de receber o resultado, anote o valor da coluna constraint_keys do registo 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 seguinte instrução:
    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 tem de ser contíguo. Por exemplo, o valor da coluna constraint_keys pode ser da seguinte forma:
    ([ColumnName] > (1001) AND [ColumnName]<=(2001)
    OU [ColumnName] > (9001) AND [ColumnName]<=(10001))
    Nota Este artigo utiliza neste exemplo para apresentar o código no resto dos passos.

    Neste exemplo, os intervalos em que cada abrangem 1.000 valores. 1.000 é o tamanho de intervalo predefinido. No entanto, pode alterar o tamanho do intervalo de identidade utilizando um dos seguintes métodos:
    • Especificar @ pub_identity_range parâmetro quando executa o sp_addmergearticle procedimento armazenado.
    • Altere a propriedade tamanho do intervalo de subscritor para o artigo na caixa de diálogo Propriedades do artigo .
  4. Se detectar o problema descrito na secção "Sintomas", o valor de identidade actual que anotou no passo 2 deve ser menor do que o limite inferior do primeiro intervalo de identidade da restrição de verificação de intervalo de identidade que anotou no passo 3.

    Se o valor de identidade actual no passo 2 é maior do que o limite superior do segundo intervalo de identidade do intervalo de identidade verificar restrição, resolver o problema utilizando o método recomendado na mensagem de erro. Por este motivo, deverá executar o procedimento sp_adjustpublisheridentityrange armazenados no Editor.

    Para mais informações sobre o procedimento armazenado sp_adjustpublisheridentityrange, visite o seguinte Web site da Microsoft Developer Network (MSDN):
    http://msdn.microsoft.com/en-us/library/ms181527.aspx
  5. Execute a seguinte instrução para determinar se as linhas são nos intervalos de identidade actual da restrição de verificação de intervalo de identidade:
    SELECT COUNT(*) FROM TableName WHERE 
    ([ColumnName]>(1001) AND [ColumnName]<=(2001) 
    OR [ColumnName]>(9001) AND [ColumnName]<=(10001))
    
    notas
    • Se a instrução devolve 0, sem linhas são nos intervalos de identidade actual. Neste caso, avance para o passo 6.
    • Se a instrução devolve um valor maior do que 0, execute a seguinte instrução para obter o valor máximo identidade nos intervalos de identidade actual:
      SELECT MAX(ColumnName) as MaxValue FROM TableName WHERE 
      ([ColumnName]>(1001) AND [ColumnName]<=(2001) OR 
      [ColumnName]>(9001) AND [ColumnName]<=(10001))
      
      anote o valor devolvido e avance para o passo 7.
  6. Reseed manualmente a identidade actual para a tabela problemática a dividem-se dentro de um intervalo válido.

    Reseed a identidade actual ao valor mais baixo de intervalos de identidade actual mais 1. Por exemplo, se o valor mais baixo dos intervalos de identidade actual for 1001, o primeiro valor no intervalo possível é 1002 porque o fim do intervalo da restrição de verificação de intervalo de identidade baixo utiliza o maior do que o sinal (>). Para efectuar este procedimento, execute a seguinte instrução no Editor e, em seguida, avance para o passo 8:
    DBCC CHECKIDENT ('TableName', RESEED, 1002)
  7. Reseed manualmente a identidade actual para a tabela problemática a dividem-se dentro de um intervalo válido.

    Suponha que o incremento de identidade é 1. Reseed a identidade actual para o valor que anotou no passo 5 e, em seguida, adicione 1. Por exemplo, se o valor que anotou no passo 5 1507, reseed a identidade actual para 1508. Para o fazer, execute a seguinte instrução no Editor:
    DBCC CHECKIDENT ('TableName', RESEED, 1508)
  8. Execute um teste para determinar se novas linhas podem ser inserir na tabela na base de dados o publisher sem erro 548 ocorra.
Para obter mais informações sobre os ficheiros que são alterados e para obter informações sobre quaisquer pré-requisitos para aplicar o pacote de actualização cumulativa que contém a correcção que é descrita neste artigo da base de dados de conhecimento da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
951217Pacote de actualização cumulativa 8 para o SQL Server 2005 Service Pack 2

Referências

Para obter mais informações sobre a lista de compilações disponíveis depois de SQL Server Service Pack 2, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
937137Cria o SQL Server 2005 que foram disponibilizadas após o lançamento do SQL Server 2005 Service Pack 2
Para obter mais informações sobre o modelo de assistência incremental para o SQL Server, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
935897Um modelo de assistência incremental está disponível a equipa do SQL Server para proporcionar correcções para problemas comunicados
Para obter mais informações sobre como obter o SQL Server 2005 Service Pack 2, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
913089Como obter o service pack mais recente para o SQL Server 2005
Para mais informações sobre as novas funcionalidades e melhorias no SQL Server 2005 Service Pack 2, visite o seguinte Web site da Microsoft:
http://go.microsoft.com/fwlink/?LinkId=71711
Para mais informações sobre o esquema de atribuição de nomes para o SQL Server actualizações, clique no número de artigo que se segue para visualizar o artigo na base de dados de conhecimento da Microsoft:
822499Novo esquema de atribuição de nomes de ficheiros para pacotes de actualização de software do Microsoft SQL Server
Para obter mais informações sobre a terminologia de actualização de software, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
824684Descrição da terminologia padrão utilizada para descrever actualizações de software da Microsoft

Propriedades

Artigo: 953481 - Última revisão: 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 2005 Server Enterprise
  • 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 2005 Server Workgroup
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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