Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Trigger verhindet löschen eines Datensatzes (https://www.delphipraxis.net/54243-trigger-verhindet-loeschen-eines-datensatzes.html)

VizeTE 30. Sep 2005 13:25

Datenbank: Interbase • Version: 4 • Zugriff über: BDE

Trigger verhindet löschen eines Datensatzes
 
Hallo zusammen,

ich habe ein Problem mit einem Trigger.

Ich füge einen neuen Datensatz in eine Tabelle ein. Auf dem Ereignis "Before Update" liegt ein Trigger der den DS um Datum und Uhrzeit ergänzt.
Wenn ich im Anschluß diesen DS wieder löschen will bekomme ich folgende Fehlermeldung:

Datensatz kann nicht gesperrt werden, da der Datensatz von einem anderen Benutzer geändert wurde.

Wenn ich den Trigger deaktiviere funktionierts problemlos. Ich möchte aber nur ungern auf die Funktionalität des Triggers verzichten.

Eingentlich macht das in meinen Augen auch nicht so richtig Sinn, oder wird "Before Update" auch beim hinzufügen eines DS ausgeführt?
Wenn ich einen Trigger auf "Before Insert" setze funktioniert das alles auch problemlos. Ich möchte aber das Datum auch beim ändern der Daten aktualisiert haben.

Hat jemand einen Tip für mich?

Vielen Dank - Daniel

jensw_2000 30. Sep 2005 13:44

Re: Trigger verhindet löschen eines Datensatzes
 
Interbase kenne ich nich so gut.
Gibt es bei IB in den Triggern auch die temporärern Tabellen INSERTED und DELETED, so wie das bei MSSQL der Fall ist?

Falls ja, könntest du es wie folgt lösen:

SQL-Code:
DECLARE @DelCount INT

SELECT @DelCount=COUNT(*) FROM DELETED

IF (@DelCount IS NULL) OR (@DelCount = 0)
BEGIN
  -- es wurde kein Datansatz gelöscht
  ... hier den Trigger Code ausführen
END
ELSE BEGIN
  -- es wurde min. ein Datansatz gelöscht
  ... Trigger Code wird nicht ausgeführt
END
Schöne Grüße,
Jens
:hi:

VizeTE 30. Sep 2005 13:51

Re: Trigger verhindet löschen eines Datensatzes
 
Solche temporären Tabellen sind mir nicht bekannt.

Ich habe inzwischen eine Möglichkeit gefunden das Problem zu umgehen. Bisher habe ich direkt in der Abfrage den Datensatz mit "Query.Delete" gelöscht. So kam es zu oben beschriebenen Fehler.
Jetzt habe ich eine weitere "Delete FROM..." Abfrage eingesetzt und es funktioniert erst einmal.
Aber so richtig schön finde ich das nicht.

Würde micht sehr freuen wenn mir da noch jemand auf die Sprünge helfen könnte.

Gruss

Hansa 30. Sep 2005 15:41

Re: Trigger verhindet löschen eines Datensatzes
 
Zitat:

Zitat von VizeTE
..Ich füge einen neuen Datensatz in eine Tabelle ein. Auf dem Ereignis "Before Update" liegt ein Trigger der den DS um Datum und Uhrzeit ergänzt...

Warum wird ein Update-Trigger verwendet beim Insert ? :shock: Du hast doch bestimmt einen Trigger, um die ID hochzuzählen. Also ist das doch die beste Stelle, das Datum gleich mit abzuspeichern.

VizeTE 30. Sep 2005 17:13

Re: Trigger verhindet löschen eines Datensatzes
 
Zitat:

Zitat von Hansa
Warum wird ein Update-Trigger verwendet beim Insert ?

Nein, es wird natürlich beim Insert nicht der Update-Trigger verwendet sondern ein anderer. Aber der Inhalt des Triggers ist der gleiche. Ich wollte damit nur verdeutlichen, daß es am Trigger selbst nicht liegen sollte. Da wird nur folgender Code ausgeführt:
Delphi-Quellcode:
new.Modified = 'now';
Zitat:

Zitat von Hansa
Du hast doch bestimmt einen Trigger, um die ID hochzuzählen.

Für diese Tabelle gibt es ausnahmsweise keinen Trigger der eine Id hochzählt. Aber das sollte ja auch keine Rolle spielen. Auf diese Tabelle gibt es nur 2 Trigger. Einen für "Before Insert" und einen für "Before Update". Damit ich Probleme durch 2 Trigger ausschließen kann habe ich das Szenario mit jeweils einen aktiven und einen deaktivierten Trigger durchgespielt.
Den Fehler gibt es nur beim "Before Update"-Trigger.

Ohne großes Hintergrundwissen würde ich vermuten das die Datenbank den Trigger als einen anderen Benutzer/eine andere Session laufen läßt. Aber das macht ja keinen richtigen Sinn. Wenn ich die DB eine Transaction ausführen lasse dann weiß sie ja auch das ein Trigger zu dieser Transaction gehört. Also müßte es doch in der gleichen Session passieren?!

Hansa 30. Sep 2005 17:24

Re: Trigger verhindet löschen eines Datensatzes
 
Habe in der DB nachgeguckt : alle Felder, die durch ein Insert automatisch beeinflußt werden, kriegen diese Sachen mit einem BI-Trigger verpaßt. Default Werte usw. Soll bei einem UPDATE noch was gemacht werden, so erledigt das ein AFTER UPDATE Trigger, kein BEFORE ! Womit wird das Ganze überhaupt getestet ? Ist das wirklich noch IB 4 ?

Jelly 30. Sep 2005 17:42

Re: Trigger verhindet löschen eines Datensatzes
 
Kannst du nicht mit Default Werten arbeiten, die du gleich beim Erstellen der Tabelle angibst.

Hansa 30. Sep 2005 18:21

Re: Trigger verhindet löschen eines Datensatzes
 
Siehe dieses Beispiel hier. Beim Erstellen der Tabelle kann ich doch noch nicht wissen, daß ich in 1 Stunde um 20:19:55,4 einen neuen Datensatz anlege ! Der Trigger überwacht das ganze deshalb und merkt sich, daß da die Zeit festgehalten werden muß, auch wenn ichs vergesse. 8)

VizeTE 1. Okt 2005 11:15

Re: Trigger verhindet löschen eines Datensatzes
 
Zitat:

Zitat von Hansa
Soll bei einem UPDATE noch was gemacht werden, so erledigt das ein AFTER UPDATE Trigger, kein BEFORE ! Womit wird das Ganze überhaupt getestet ? Ist das wirklich noch IB 4 ?

Das "After Update" habe ich auch schon probiert. Da stand danach leider nichts in der DB - naja was heißt nichts, nicht das was der Trigger schreiben sollte. Zur Sicherheit werde ich das aber nochmal probieren.
Zum Test: In die Datenbank habe ich mit einen Delphi-Programm und den BDE-Komponenten geschrieben. Geprüft was in der DB drin steht habe ich mit dem DB-Explorer.
Ja, das ist wirklich noch IB4, leider ;)

MagicAndre1981 1. Okt 2005 11:30

Re: Trigger verhindet löschen eines Datensatzes
 
Warum muss es unbedingt der IB4 sein? Schonmal über ein Wechsel auf eine höhere Version nachgedacht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 Uhr.
Seite 1 von 3  1 23      

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