Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Trigger - TADOTable Löschfehler (https://www.delphipraxis.net/54830-sql-trigger-tadotable-loeschfehler.html)

needatip 12. Okt 2005 10:19

Datenbank: SQL SERVER 2000 • Zugriff über: ADO

SQL Trigger - TADOTable Löschfehler
 
Hallo zusammen.

Ich verwende für den Zugriff auf einen SQL Server 2 ADOTable (Master/Detail) Komponenten.
Nun habe ich einen Trigger erstellt, der einen Datensatz, den ich von der Master Tabelle lösche, in eine andere Tabelle wegsichert.
Im Enterprise Manager des SQL Servers funktioniert der Trigger einwandfrei, nur wenn ich ein Table.delete von Delphi ausführe bekomm ich eine OLE-Exception Fehlermeldung: "Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit
dem letzten Lesen ggf. geändert".

Dadurch dass ich ntext Felder verwende kann ich auch keine After-Delete Trigger verwenden sondern muss lt. Anleitung
einen Instead-of-Delete Trigger verwenden und den Löschbefehl im Trigger einbauen.

Der Datensatz wird letztendlich auch gelöscht und in die Sicherungstabelle geschrieben.

Der Trigger sieht folgendermaßen aus:

CREATE TRIGGER [LAGER_ARCHIVIEREN]
ON dbo.LAGER
INSTEAD OF DELETE
AS
BEGIN
DELETE FROM BILDER WHERE NR IN (SELECT I_NUMMER FROM deleted)
INSERT INTO LAGERARCHIV
SELECT *,SYSTEM_USER,GETDATE() FROM deleted
DELETE FROM LAGER
WHERE I_NUMMER IN (SELECT I_NUMMER FROM deleted)
END

Wer kann mir bei dem Problem weiterhelfen ?

alzaimar 12. Okt 2005 19:39

Re: SQL Trigger - TADOTable Löschfehler
 
Jaaaaa, gemeine Sache, wie?

ADO erwartet als Antwort vom SQL-Server beim Löschen einer Zeile ein '1 Row(s) affected'. Wenn da etwas anderes steht, z.B. '0 Row(s) affected' oder so, dann interpretiert dieses oberschlaue ADO das eben so, das das DELETE nicht geklappt hat. Blödes ADO.

Du musst im Trigger mit 'SET NOCOUNT ON' dafür sorgen, das keine dieser Meldungen (ausser der richtigen!) gliefert wird.
SET NOCOUNT ON unterdrückt die Ausgabe der Meldungen, SET NOCOUNT schaltet sie wieder an.

Gewöhn dir an, alle stored procedures und Trigger mit SET NOCOUNT ON einzuleiten. Das erspaart einem ne ganze Menge Ärger.

needatip 12. Okt 2005 20:04

Re: SQL Trigger - TADOTable Löschfehler
 
Hey super,
hast mir echt mein Kopfzerbrechen beendet.
Muss ich im Trigger am Schluss SET NOCOUNT nochmals einbauen, bzw wenn nicht, geht mir irgendwas verloren?

Danke nochmals.

alzaimar 12. Okt 2005 20:53

Re: SQL Trigger - TADOTable Löschfehler
 
Na, eine Grundregel sollte sein, das man den Laden so verlässt, wie man ihn vorfindet.
Also sollte die SP (Trigger) so sein:
SQL-Code:
SET NOCOUNT ON
...
SET NOCOUNT OFF
Ob das nötig ist, weiss ich nicht genau, ehrlich gesagt.

needatip 13. Okt 2005 09:08

Re: SQL Trigger - TADOTable Löschfehler
 
OK, Vielen Dank nochmal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz