AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird 2.5 Generator falsch - Trigger FireDAC
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird 2.5 Generator falsch - Trigger FireDAC

Ein Thema von Emwykey · begonnen am 6. Feb 2018 · letzter Beitrag vom 15. Feb 2018
Antwort Antwort
Seite 1 von 2  1 2      
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#1

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 11:01
Was bedeutet denn "..stimmt er nicht mehr.." konkret?
Ein Generator liefert gemäß Vorgabe eindeutige Werte in einem bestimmten Range. Macht er das nicht?
Und wie Frickler schon angemerkt hat:
Die Konstruktion des Triggers deutet darauf hin, dass das System darauf ausgelegt ist, Werte zu akzeptieren, die nicht vom Generator stammen.
Wenn Du nun sagst, das passiert in der Realität sowieso nicht, dann tu Dir doch den Gefallen, den Trigger auch so zu schreiben, dass das garantiert ist. Ein garantiertes Systemverhalten will man ja normalerweise erreichen.
Gruß, Jo
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#2

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 11:13
Wenn ID nicht initialisiert wird, dann ist die IS Null-Abfrage (mit Verlaub) unsinnig.

Soll eine ID vergeben werden?

Wenn ja, sollte man das auch tun und die Vergabe nicht von einer Bedingung abhängig machen, auf die man keinen Einfluss hat bzw. die, wenn sie doch mal zutreffen sollte, kontraproduktiv ist.

Das wäre dann so höchstwahrscheinlich sinnvoller:
SQL-Code:
CREATE TRIGGER TABELLE1_ARCHIV_BI FOR TABELLE1_ARCHIV BEFORE INSERT POSITION 0 As Begin
  New.ID = Gen_ID(ID_GEN_Tabelle1_Archiv, 1);
end
  Mit Zitat antworten Zitat
Emwykey

Registriert seit: 27. Aug 2013
51 Beiträge
 
#3

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 11:14
Hallo,

Der Generator scheint auf einen früheren Wert zurückzuspringen bei einer oder mehren Aktionen
Wenn ich zB die ID 100 vergeben habe und dann versuche die 101 zu vergeben stehen diese in der Tabelle richtig drin. Bei 102 ( es wird jede ID in dieser Tabelle ausschließlich über den Trigger generiert, es gibt auch Tabellen, da wird er Generator angesprochen ohne Trigger --> daher die Abfrage ( die Trigger sind alle identisch angelegt)) kommt es zu einem Fehler, da der Generator 101 zurück gibt. Es sieht also so aus, als ob er zurückspringen würde?????? da sonst die anderen IDs nie hätten erzeugt werden können.

Daher kann es nicht an der Abfrage im Trigger liegen, selbst wenn der Generator nicht angesprochen werden würde dürfte keine höhere ID in der Tabelle stehen. Das ist im Programm absolut unmöglich. Es scheint einen Moment zu geben, an welchem die Funktion GEN_ID den korrekten Wert liefert, aber der Generator nicht mehr erhöht wird. Ich hatte sogar schon den Fall, dass die Werte um mehrere IDs auseinander lagen.


Sicherlich ist das richtig, dass es besser wäre 0 mit zu prüfen, hat aber leider mit dem Fehler nichts zu tun.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.395 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 11:20
Sicherlich ist das richtig, dass es besser wäre 0 mit zu prüfen, hat aber leider mit dem Fehler nichts zu tun.
Nö. Is Null ist an der Stelle korrekt, da ID=0 ein valider Wert ist.


Wie schaut denn dein Insert-Befehl an der Stelle aus (oder hast Du mehrere)? Du schreibst, dass die Tabelle ein "Archiv" ist, d.h. du schiebst da von einer Tabelle bestehende Datensätze da rein. Wird die ID von der bestehenden Tabelle auch in die neue Tabelle übernommen?
  Mit Zitat antworten Zitat
Emwykey

Registriert seit: 27. Aug 2013
51 Beiträge
 
#5

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 11:29
ja, wird übernommen, allerdings in ein anderes feld, da insert update und delete geloggt werden.
Hier ein Beispiel ( Trigger auf TAbelle1 ):
Code:
CREATE TRIGGER TRIG_TABELLE1_LOG_BD FOR Tabelle1 BEFORE DELETE POSITION 0 as begin

Insert Into Tabelle1_Archiv (
Zeitstempel, Daten1, Daten2, ID_Tabelle1
) values ( Old.Zeitstemple, Old.Daten1, Old.Daten2, Old.ID ); end
Aufbau der Tabelle1:
ID | Zeitstemple | Daten1 | Daten2

Aufbau der Tabelle1_Archiv

ID | Zeitstemple | Daten1 | Daten2 | Tabelle1_ID

Before Insert ist natürlich mit NEW angegeben


ID 0 wird im System nicht verwendet, darf also nicht vorkommen , auch wenn es technisch natürlich ein gültiger Wert ist
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.395 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 11:48

ID 0 wird im System nicht verwendet, darf also nicht vorkommen , auch wenn es technisch natürlich ein gültiger Wert ist
echt? schon mal geschaut, was ein Trigger bei gen_ID(x,1) macht, der seinen maximalen Wert erreicht hat (9.223.372.036.854.775.807)?


die einfachste Lösung ist, dass Du die falschen Werte per Insert oder Update in die Tabelle schreibst. Das scheint nicht der Fall zu sein (obwohl ich nicht weiß was du in den Tiefen deiner SOftware so treibst )

Weiter ist denkbar, dass Du den Generatorwert der Archivtabelle manuell änderst (z.B. nach einem Rollback). Einen Updatetrigger gibt es nicht für die Archivtabelle?

Testest Du gerade an einer Produktivdatenbank? Zur Sicherheit (obwohl ich nicht denke, dass das die Ursache ist), check Deine Datenbank mal mit gfix (gfix -v -full -u sysdba -p <password> <Datenbankdatei>).
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#7

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 11:59
Wenn dem so ist, wie oben beschrieben, wäre die Prüfung im Trigger zu ändern.

Wenn new.id is null oder new.id = 0 wird ein Wert vom Generator geholt, in jedem anderen Fall wird ein Fehler ausgelöst, um darüber festzustellen, wer da ggfls. was liefert. Ausgehend von Deiner Beschreibung dürfte dies eigentlich nie passieren (aber man weiß ja nie )

Zuerst muss sichergestellt werden, dass von keiner Stelle eine ID in die Tabelle geschrieben wird, außer vom Trigger unter Zuhilfenahme des Generators.

Ein bisserl Info zum Thema: http://www.ibexpert.net/ibe_de/index...orenGrundlagen

Eventuell hilft dies bei der Fehlersuche. Der Fehler muss nicht zwingend in der Datenbank liegen, eventuell verhält sich irgendwo in einem Programm etwas nicht so, wie es eigentlich von der Systemarchitektur vorgesehen ist.

Z. B.:
Gibt es irgendwo ein Programm, das bei 'nem Rollback meint, den Generator zurücksetzen zu müssen.
Oder holt sich irgendwo jemand 'nen Wert vom Generator und zählt dann selbst weiter und schreibt in die Tabelle, so dass der Generator dadurch quasi "überholt" wird?

Prinzipell scheint es mir (mit den bisherigen Informationen) so, dass man auch mal alles außerhalb der Datenbank, was irgendwie mit den Tabellen zu tun hat (oder haben könnte), überprüfen müsste. Wird irgendwo auf den Generator zugegriffen, außer vom Trigger aus?

Habe leider keine Stelle gefunden, an der ein ähnlicher Fehler beschrieben wird, um festzustellen, ob es eventuell ein bekanntes Datenbankproblem sein könnte.
  Mit Zitat antworten Zitat
Emwykey

Registriert seit: 27. Aug 2013
51 Beiträge
 
#8

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 12:25
Hallo, danke für die Antwort, es gibt aber wirklich zu 100 % keine Stelle im Hauptprogramm und auch kein weiteres Programm welches abgesehen von den Triggern auf den Generator zugreift oder Werte in die Tabelle schreibt, ich hab sicherheitshalber noch einmal den ganzen Sourcecode geprüft. Es ist wirklich ausschließlich der Trigger - nach einem Backup und Restore läuft es auch wieder, allerdings tritt das Problem immer wieder und an verschiedenen stellen ( wie am Anfang erwähnt auf mit anderen Generatoren ) auf es ist zum Mäuse melken
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 12:41
Hallo,
wie Lemmy geschrieben hatte, musst Du bei RollBacks aufpassen.
Meines Wissens laufen die Generatoren ausserhalb der Rollbacks.

siehe auch hier:
http://firebirdsql.org/pdfmanual/Fir...ide-German.pdf

Komisch ist, dass er auf einem alten Wert steht.
Laut dem Generatorguide hätte ich eher Lücken in der Sequenz erwartet.

Zitat:
Hallo, der Wert wird nicht initialisiert
Das sagst Du, aber was sagt FireDAC?

Du hattest geschrieben, dass du nichts vergleichbares gefunden hattest.
Vielleicht ja so was ?
http://tracker.firebirdsql.org/browse/CORE-2041


Wie viele Insert-Statements in die Archiv-Tabelle hast Du in deinem Code?
Heiko

Geändert von hoika ( 6. Feb 2018 um 12:45 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#10

AW: Firebird 2.5 Generator falsch - Trigger FireDAC

  Alt 6. Feb 2018, 12:45
Verstehe ich das jetzt richtig:

Der Generator gibt bei Abfrage z. B. den Wert 100 aus, obwohl er eigentlich schon bei 105 sein sollte.

Nun machst Du ein Backup und ein Restore und fragst dann den Generator erneut ab und er enthält dann den erwarteten Wert von 105?

Das sieht dann aber eher nach einem Datenbankproblem aus. Gibt es da irgendwo einen Bug?

Wie hoika schreibt, darf bei der Vergabe der ID eine Lücke entstehen, wenn ein Rollback gemacht wird, aber das ein Generator auf einem alten, bereits vergebenen, Wert steht, widerspricht der Spezifikation.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 06:28 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