AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Trigger verhindet löschen eines Datensatzes
Thema durchsuchen
Ansicht
Themen-Optionen

Trigger verhindet löschen eines Datensatzes

Ein Thema von VizeTE · begonnen am 30. Sep 2005 · letzter Beitrag vom 5. Okt 2005
Antwort Antwort
Seite 1 von 3  1 23      
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#1

Trigger verhindet löschen eines Datensatzes

  Alt 30. Sep 2005, 13:25
Datenbank: Interbase • Version: 4 • Zugriff über: BDE
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
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#2

Re: Trigger verhindet löschen eines Datensatzes

  Alt 30. Sep 2005, 13:44
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
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: Trigger verhindet löschen eines Datensatzes

  Alt 30. Sep 2005, 13:51
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Trigger verhindet löschen eines Datensatzes

  Alt 30. Sep 2005, 15:41
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 ? Du hast doch bestimmt einen Trigger, um die ID hochzuzählen. Also ist das doch die beste Stelle, das Datum gleich mit abzuspeichern.
Gruß
Hansa
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: Trigger verhindet löschen eines Datensatzes

  Alt 30. Sep 2005, 17:13
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:
new.Modified = 'now';
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?!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Trigger verhindet löschen eines Datensatzes

  Alt 30. Sep 2005, 17:24
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 ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Trigger verhindet löschen eines Datensatzes

  Alt 30. Sep 2005, 17:42
Kannst du nicht mit Default Werten arbeiten, die du gleich beim Erstellen der Tabelle angibst.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8

Re: Trigger verhindet löschen eines Datensatzes

  Alt 30. Sep 2005, 18:21
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)
Gruß
Hansa
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#9

Re: Trigger verhindet löschen eines Datensatzes

  Alt 1. Okt 2005, 11:15
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
  Mit Zitat antworten Zitat
Benutzerbild von MagicAndre1981
MagicAndre1981

Registriert seit: 4. Jun 2004
Ort: Nordhausen
2.214 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Trigger verhindet löschen eines Datensatzes

  Alt 1. Okt 2005, 11:30
Warum muss es unbedingt der IB4 sein? Schonmal über ein Wechsel auf eine höhere Version nachgedacht?
André
"A programmer is just a tool which converts caffeine into code", daran wirds wohl liegen, dass ich Abends nie pennen kann

Zitat von Luckie:
Nicht nur dass ihr offtopic geworden seid, jetzt werdet ihr selber im Offtopic noch offtopic
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 Uhr.
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