CORRECÇÃO: As consultas JOIN nos disparadores que envolvem da tabela inserida ou a tabela excluída podem retornar resultados que não são consistentes

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: 810920
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Bug #: 363156 (SQL Server 8.0)
Sintomas
Se você implementar uma ação de exclusão em cascata entre uma tabela pai e uma tabela filho, e você define um disparador INSERT ou um disparador DELETE na tabela filho, as consultas de associação no disparador podem retornar resultados que não são consistentes. Esse problema ocorre quando as consultas de associação no disparador envolvem a tabela inserido ou a tabela excluída . Por exemplo, se o disparador DELETE na tabela filho inclui as seguintes consultas, os resultados não coincidem:
SELECT * FROM deleted INNER JOIN ParentTable on deleted.ParentID = ParentTable.ParentID	SELECT COUNT(*) FROM deleted INNER JOIN ParentTable on deleted.ParentID = ParentTable.ParentID	
Resolução

Informações sobre o service pack

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:
290211Como obter o SQL Server 2000 service pack mais recente

Informações sobre o hotfix

A versão em inglês deste hotfix tem atributos de arquivo (ou atributos de arquivo posteriores) listados na tabela a seguir. As datas e horas desses arquivos são listadas na acordo hora universal coordenada (UTC). Quando você exibe as informações do arquivo, ele é convertido para a hora local. Para encontrar a diferença entre o UTC e a hora local, use a guia fuso horário na ferramenta Data e hora no painel de controle.
   Date         Time   Version		  Size	  File name   ----------------------------------------------------------------------   18-Jan-2002  04:45  2000.80.568.0      29,244  Dbmslpcn.dll        30-Aug-2002  21:08                    786,432  Distmdl.ldf   30-Aug-2002  21:08                  2,359,296  Distmdl.mdf   09-Oct-2002  00:54                        544  Drop_repl_hotfix.sql   02-Jul-2002  15:35  2000.80.650.0     107,088  Impprov.dll         19-Jul-2002  16:56                    774,516  Instdist.sql   08-Oct-2002  23:56                     12,615  Inst_repl_hotfix.sql   20-Aug-2002  16:24  2000.80.679.0     111,172  Logread.exe         07-Apr-2002  02:08  2000.80.606.0      62,024  Odsole70.dll        03-Jan-2002  01:59                     18,185  Qfe356326.sql   20-Aug-2002  16:47  2000.80.679.0     135,748  Qrdrsvc.exe         26-Aug-2002  22:49  2000.80.679.0     406,088  Rdistcom.dll        04-Oct-2001  01:36                    437,302  Replcom.sql   20-Aug-2002  16:33  2000.80.679.0     152,136  Replmerg.exe        19-Nov-2001  20:36                    993,945  Replmerg.sql   05-Nov-2002  23:48  2000.80.700.0     221,768  Replprov.dll        04-Oct-2001  01:36                    986,906  Replsys.sql   04-Oct-2001  01:36                    881,228  Repltran.sql   26-Aug-2002  22:49  2000.80.679.0     283,208  Rinitcom.dll        16-Sep-2002  22:31                    390,045  Securityhotfix.sql   26-Aug-2002  22:49  2000.80.679.0      28,672  Sqlagent.dll        26-Aug-2002  18:39  2000.80.679.0     311,872  Sqlagent.exe        28-Aug-2002  16:32  2000.80.679.0      49,152  Sqlagent.rll   26-Aug-2002  22:49  2000.80.679.0      53,824  Sqlcmdss.dll        28-Aug-2002  16:40  2000.80.679.0      12,288  Sqlcmdss.rll   24-Oct-2002  17:37  2000.80.695.0     176,696  Sqlmap70.dll        21-Nov-2002  00:54  2000.80.705.0   7,471,185  Sqlservr.exe        21-Nov-2002  00:53                 12,633,088  Sqlservr.pdb   01-Nov-2002  18:56  2000.80.698.0      45,644  Sqlvdi.dll          18-Jan-2002  04:45  2000.80.568.0      29,244  Ssmslpcn.dll        01-Nov-2002  18:00  2000.80.697.0      82,492  Ssnetlib.dll        07-Apr-2002  02:08  2000.80.606.0      70,208  Xplog70.dll         07-Apr-2002  02:08  2000.80.606.0      53,828  Xpqueue.dll         07-Apr-2002  02:08  2000.80.606.0     156,228  Xprepl.dll          12-Jul-2002  01:00  2000.80.658.0     279,104  Xpstar.dll          16-Sep-2002  23:12  2000.80.686.0      98,872  Xpweb70.dll
Observação Devido às dependências do arquivo, o hotfix mais recente ou o recurso que contém esses arquivos também pode conter arquivos adicionais.

Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".Esse problema foi corrigido primeiro no Microsoft SQL Server 2000 Service Pack 4.
Mais Informações

Etapas para reproduzir o problema

Para reproduzir o problema, execute essas etapas:
  1. No banco de dados, crie duas tabelas que são nomeadas ParentTable e ChildTable .
  2. Cria uma relação pai-filho entre as tabelas que tenha uma cascata exclua referência e, em seguida, preencha as tabelas com dados de exemplo. To do this, run the following Transact-SQL script in SQL Query Analyzer:
    USE <Database Name>GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ParentID]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)ALTER TABLE [dbo].[ChildTable] DROP CONSTRAINT FK_ParentIDGOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t_ChildTable_Delete]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)drop trigger [dbo].[t_ChildTable_Delete]GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ChildTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[ChildTable]GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ParentTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[ParentTable]GOCREATE TABLE [dbo].[ChildTable] ([ChildID] [int] IDENTITY (1, 1) NOT NULL ,[ParentID] [int] NOT NULL ) ON [PRIMARY]GOCREATE TABLE [dbo].[ParentTable] ([ParentID] [int] IDENTITY (1, 1) NOT NULL ) ON [PRIMARY]GOALTER TABLE [dbo].[ChildTable] WITH NOCHECK ADD CONSTRAINT [PK_ChildTable] PRIMARY KEY CLUSTERED ([ChildID]) ON [PRIMARY] GOALTER TABLE [dbo].[ParentTable] WITH NOCHECK ADD CONSTRAINT [pk_Parent] PRIMARY KEY CLUSTERED ([ParentID]) ON [PRIMARY] GOALTER TABLE [dbo].[ChildTable] ADD CONSTRAINT [FK_ParentID] FOREIGN KEY ([ParentID]) REFERENCES [dbo].[ParentTable] ([ParentID]) ON DELETE CASCADE GOSET QUOTED_IDENTIFIER OFF GOSET ANSI_NULLS ON GOSET IDENTITY_INSERT ParentTable ONGOINSERT INTO ParentTable (ParentID) VALUES (1)INSERT INTO ParentTable (ParentID) VALUES (2)GOSET IDENTITY_INSERT ParentTable OFFGOINSERT INTO ChildTable (ParentID) VALUES (1)INSERT INTO ChildTable (ParentID) VALUES (2)GOSET QUOTED_IDENTIFIER ON GOSET ANSI_NULLS ON GO
  3. Crie um disparador DELETE na tabela filho. Para fazer isso, execute o seguinte script Transact-SQL no SQL Query Analyzer:
    CREATE TRIGGER t_ChildTable_DeleteON ChildTableFOR DELETEAS 	SELECT * FROM deleted INNER JOIN ParentTable on deleted.ParentID = ParentTable.ParentID	SELECT COUNT(*) FROM deleted INNER JOIN ParentTable on deleted.ParentID = ParentTable.ParentID	IF EXISTS(SELECT * FROM deleted INNER JOIN ParentTable on deleted.ParentID = ParentTable.ParentID)		PRINT 'Exists returned true'	ELSE 		PRINT 'Exists returned false'RETURNGO
  4. Excluir dados da tabela ParentTable :
    DELETE FROM parenttable WHERE parentid=2
Observação Mesmo que as consultas no uso de disparador DELETE o mesmo critério de pesquisa, os resultados não coincidem.
Referências
Para obter informações adicionais, 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

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 810920 - Última Revisão: 12/08/2015 01:43:57 - Revisão: 2.3

Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Workgroup Edition, Microsoft SQL Server 2000 Desktop Engine (Windows), Microsoft SQL Server 2000 Enterprise Edition 64-bit

  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbqfe kbtrigger kbtable kbquery kbsqlserv2000presp4fix kbfix kbbug KB810920 KbMtpt
Comentários