Update: Die JOIN-Abfragen in den Triggern, die die inserted-Tabelle oder die deleted-Tabelle enthalten möglicherweise Ergebnisse zurück, die nicht konsistent sind

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 810920 - Produkte anzeigen, auf die sich dieser Artikel bezieht
# Fehler: 363156 (SQL Server 8.0)
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn Sie eine cascading Delete Aktion zwischen einer übergeordneten Tabelle und einer untergeordneten Tabelle implementieren und Sie einen DELETE-Trigger oder eine INSERT-Trigger auf die untergeordnete Tabelle definieren, können die Join-Abfragen im Trigger Ergebnisse, die nicht konsistent sind. Dieses Problem tritt bei Verknüpfungsabfragen im Trigger in der Tabelle eingefügt oder in der Tabelle gelöscht umfassen. Beispielsweise wenn der DELETE-Trigger auf die untergeordnete Tabelle die folgenden Abfragen enthält, stimmen die Ergebnisse nicht überein:
SELECT * FROM deleted INNER JOIN ParentTable on deleted.ParentID = ParentTable.ParentID
	
SELECT COUNT(*) FROM deleted INNER JOIN ParentTable on deleted.ParentID = ParentTable.ParentID
	

Lösung

Informationen zu Service Packs

Installieren Sie das neueste Service Pack für Microsoft SQL Server 2000, um dieses Problem zu beheben. Weitere Informationen finden Sie die folgende KB-Artikelnummer:
290211So erhalten Sie das neueste Service Pack für SQL Server 2000

Hotfix-Informationen

Die englische Version dieses Hotfixes weist die Dateiattribute (oder höher Dateiattribute), die in der folgenden Tabelle aufgelistet werden. Die Datums- und Uhrzeitangaben für diese Dateien werden in Coordinated Universal Time () angegeben. Wenn Sie sich die Dateiinformationen ansehen, werden diese Angaben in die lokale Zeit konvertiert. Um die Differenz zwischen UTC und der Ortszeit zu ermitteln verwenden Sie die Registerkarte Zeitzone des Tools ? Datum und Uhrzeit in der Systemsteuerung.
   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
Hinweis: Aufgrund von Dateiabhängigkeiten enthält das aktuellste Update oder Feature, das diese Dateien enthält, möglicherweise auch weitere Dateien.

Status

Microsoft hat bestätigt, dass dies ein Problem in Microsoft-Produkten handelt, die im Abschnitt "Gilt für" aufgeführt sind.Dieses Problem wurde erstmals im Microsoft SQL Server 2000 Service Pack 4.

Weitere Informationen

Schritte zum Reproduzieren des Problems

Gehen Sie folgendermaßen vor, um das Problem zu reproduzieren:
  1. Erstellen Sie in der Datenbank die beiden Tabellen mit den Namen ParentTable und ChildTable .
  2. Erstellen Sie eine Parent-Child-Beziehung zwischen Tabellen, die hat eine cascading Verweis löschen und anschließend die Tabellen mit Beispieldaten füllen. To do this, run the following Transact-SQL script in SQL Query Analyzer:
    USE <Database Name>
    GO
    
    if 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_ParentID
    GO
    
    if 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]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ChildTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[ChildTable]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ParentTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[ParentTable]
    GO
    
    CREATE TABLE [dbo].[ChildTable] (
    [ChildID] [int] IDENTITY (1, 1) NOT NULL ,
    [ParentID] [int] NOT NULL 
    ) ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[ParentTable] (
    [ParentID] [int] IDENTITY (1, 1) NOT NULL 
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[ChildTable] WITH NOCHECK ADD 
    CONSTRAINT [PK_ChildTable] PRIMARY KEY CLUSTERED 
    (
    [ChildID]
    ) ON [PRIMARY] 
    GO
    
    ALTER TABLE [dbo].[ParentTable] WITH NOCHECK ADD 
    CONSTRAINT [pk_Parent] PRIMARY KEY CLUSTERED 
    (
    [ParentID]
    ) ON [PRIMARY] 
    GO
    
    ALTER TABLE [dbo].[ChildTable] ADD 
    CONSTRAINT [FK_ParentID] FOREIGN KEY 
    (
    [ParentID]
    ) REFERENCES [dbo].[ParentTable] (
    [ParentID]
    ) ON DELETE CASCADE 
    GO
    
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    
    SET IDENTITY_INSERT ParentTable ON
    GO
    INSERT INTO ParentTable (ParentID) VALUES (1)
    INSERT INTO ParentTable (ParentID) VALUES (2)
    GO
    SET IDENTITY_INSERT ParentTable OFF
    GO
    INSERT INTO ChildTable (ParentID) VALUES (1)
    INSERT INTO ChildTable (ParentID) VALUES (2)
    GO
    
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO
    
  3. Erstellen Sie einen DELETE-Trigger für die untergeordnete Tabelle. Führen Sie hierzu das folgende Transact-SQL-Skript in SQL Query Analyzer:
    CREATE TRIGGER t_ChildTable_Delete
    ON ChildTable
    FOR DELETE
    AS 
    	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'
    
    RETURN
    GO
  4. Löschen Sie Daten aus der Tabelle ParentTable :
    DELETE FROM parenttable WHERE parentid=2
Hinweis: Die Abfragen in DELETE-Trigger verwenden die gleichen Suchbedingung selbst betrachtet, entsprechen die Ergebnisse nicht.

Informationsquellen

Weitere Informationen finden Sie die folgende KB-Artikelnummer:
824684Erläuterung von Standardbegriffen bei Microsoft Softwareupdates

Eigenschaften

Artikel-ID: 810920 - Geändert am: Freitag, 2. November 2007 - Version: 2.3
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbmt kbhotfixserver kbqfe kbqfe kbtrigger kbtable kbquery kbsqlserv2000presp4fix kbfix kbbug KB810920 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 810920
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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