CORRECÇÃO: Actualização com o próprio associação poderão actualizar o número incorrecto de linhas

Traduções de Artigos Traduções de Artigos
Artigo: 285870 - Ver produtos para os quais este artigo se aplica.
N.º DE BUGS: 101111 (SQLBUG_70)
Erro n.º: 351761 (SHILOH_bugs)
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Uma operação UPDATE não pode modificar o número correcto de linhas se as seguintes condições se verificarem:
  • A consulta actualiza uma coluna ColA, de uma tabela TabA.
  • A consulta referencia TabA novamente, utilizando um alias TabB.
  • Existe uma referência para TabB.ColA algures na consulta.
  • Nenhuma das colunas a ser actualizadas no TabA são colunas indexadas.
  • Uma associação de hash ou impressão em série é utilizada.

Causa

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

Resolução

SQL Server 2000

Para resolver este problema, obtenha o service pack mais recente do Microsoft SQL Server 2000. Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
290211INF: How to Obtain the Latest SQL Server 2000 Service Pack

SQL Server 7.0

Para resolver este problema, obtenha o service pack mais recente do Microsoft SQL Server 7.0. Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
301511INF: How to Obtain the Latest SQL Server 7.0 Service Pack


Nota : A correcção seguinte foi criada anterior ao Microsoft SQL Server 7.0 Service Pack 4.

A versão inglesa desta correcção deverá ter os seguintes atributos de ficheiro ou posteriores:
   Version      File name       Platform
   -------------------------------------

   7.00.978     s70978i.exe     x86
   7.00.978     s70978a.exe     Alpha
				
Nota : devido a dependências de ficheiros, a correcção mais recente ou funcionalidade que contém os ficheiros anteriores poderá também conter ficheiros adicionais.

Como contornar

Para contornar este problema:
  • Força uma associação de ciclo utilizando OPTION (LOOP JOIN).

    - ou -

  • Adicione um índice em colunas actualizadas.

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no início deste artigo.

SQL Server 2000
Este problema foi corrigido pela primeira vez no SQL Server 2000 Service Pack 1.

SQL Server 7.0
Este problema foi corrigido pela primeira vez no Microsoft SQL Server 7.0 Service Pack 4.

Mais Informação

Protecção de dia das Bruxas é necessário para impedir uma situação onde a localização física de uma linha numa tabela alterada devido a uma operação UPDATE. Como resultado, a mesma linha pode ser revista várias vezes no contexto de uma única operação lógica, que não deve ocorrer. Se forem cumpridas as condições para este erro específico, o optimizador do SQL Server não pode criar um plano com protecção de dia das Bruxas adequado.

O exemplo seguinte 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)
				
seguem-se o conteúdo correcto da tabela após a actualização:

--Correctos:
id          pid         rn       fn                                                                                                                                                                                                                                                               
----------- ----------- -------- ---- 
0           NULL        root     root
1           0           1        root/1
				
seguem-se os resultados obterá antes para aplicar a correcção:

--Incorrectos:
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

Artigo: 285870 - Última revisão: 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 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: 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