CORRECÇÃO: Atualização com auto-associação pode atualizar número incorreto de linhas

Traduções deste artigo Traduções deste artigo
ID do artigo: 285870 - Exibir os produtos aos quais esse artigo se aplica.
BUG #: 101111 (SQLBUG_70)
Erro nº: 351761 (SHILOH_bugs)
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Uma operação UPDATE não pode modificar o número correto de linhas se as seguintes condições são atendidas:
  • Sua consulta atualiza uma coluna, ColA, de uma tabela TabA.
  • A consulta referências TabA novamente, usando um alias TabB.
  • Há uma referência para TabB.ColA em algum lugar na consulta.
  • Nenhuma das colunas que estão sendo atualizadas no TabA são colunas indexadas.
  • Uma associação hash direta ou mesclagem é usada.

Causa

O plano de consulta não pode incluir um spool tabela necessário abaixo o operador UPDATE, o que é necessário para fornecer proteção de dia das Bruxas.

Resolução

SQL Server 2000

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft SQL Server 2000. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
290211INF: Como obter o Service Pack mais recente do SQL Server 2000

SQL Server 7.0

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft SQL Server 7.0. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
301511INF: Como obter o Service Pack mais recente do SQL Server 7.0


Observação : O seguinte hotfix foi criada antes do Microsoft SQL Server 7.0 Service Pack 4.

A versão em inglês dessa correção deve ter os seguintes atributos de arquivo ou posteriores:
   Version      File name       Platform
   -------------------------------------

   7.00.978     s70978i.exe     x86
   7.00.978     s70978a.exe     Alpha
				
Observação : devido a dependências do arquivo, o hotfix mais recente ou o recurso que contém os arquivos anteriores pode também conter arquivos adicionais.

Como Contornar

Para contornar esse problema:
  • Forçar uma associação de loop usando OPTION (LOOP JOIN).

    - ou -

  • Adicione um índice em colunas atualizadas.

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no começo deste artigo.

SQL Server 2000
Esse problema foi corrigido primeiro no SQL Server 2000 Service Pack 1.

SQL Server 7.0
Esse problema foi corrigido primeiro no Microsoft SQL Server 7.0 Service Pack 4.

Mais Informações

Proteção de dia das Bruxas é necessário para evitar uma situação onde o local físico de uma linha dentro de uma tabela seja alterado devido a uma operação UPDATE. Como resultado, a mesma linha pode ser revista várias vezes dentro do contexto de uma única operação lógica, que não deve ocorrer. Se as condições para esse bug específica forem atendidas, o otimizador do SQL Server não pode criar um plano com proteção apropriada de dia das Bruxas.

O exemplo a seguir demonstra o problema:
set nocount on
create table test(id int, pid int, fn varchar(256), rn varchar(8))
go
declare @c int
set @c = 1
insert into test values(0, NULL, 'root', 'root')
while @c < 10
begin
   insert into test values(@c, @c-1, NULL, cast(@c as varchar(8)))
   set @c = @c + 1
end
create unique clustered index idx_c_id on test(id)
go
update test
set fn = parent.fn + '/' + test.rn
from test(index=0) , test parent(index=0)
where test.pid = parent.id and test.fn is NULL --  and parent.fn <> ''
option(hash join,force order)
				
aqui é o conteúdo correto da tabela após a atualização:

Resultados--CORRETOS:
id          pid         rn       fn                                                                                                                                                                                                                                                               
----------- ----------- -------- ---- 
0           NULL        root     root
1           0           1        root/1
				
aqui são os resultados obter antes para aplicação da correção:

Resultados INCORRETOS--:
id          pid         rn       fn                                                                                                                                                                                                                                                               
----------- ----------- -------- ----
0           NULL        root     root
1           0           1        root/1
2           1           2        root/1/2
3           2           3        root/1/2/3
4           3           4        root/1/2/3/4
5           4           5        root/1/2/3/4/5
6           5           6        root/1/2/3/4/5/6
7           6           7        root/1/2/3/4/5/6/7
8           7           8        root/1/2/3/4/5/6/7/8
9           8           9        root/1/2/3/4/5/6/7/8/9

				

Propriedades

ID do artigo: 285870 - Última revisão: terça-feira, 28 de outubro de 2003 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palavras-chave: 
kbmt kbbug kbfix KB285870 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: 285870

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