AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird: Generator mit dynamischen Namen
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird: Generator mit dynamischen Namen

Ein Thema von MrSpock · begonnen am 31. Aug 2015 · letzter Beitrag vom 1. Sep 2015
Antwort Antwort
Seite 2 von 2     12   
Lemmy

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

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 12:02
danke für die Info. Hast du eine Ahnung, warum diese Warnung ausgesprochen wird?
Ich denke aus dem selben Grund weshalb man bei Firebird (und anderen) nicht in den Systemtabellen manuell rumwursteln soll:
Weil Dinge schief gehen können. Das Beispiel mit dem Messer ablecken finde ich sehr treffend

Beispiel: Kollege wollte einen Float vergrößern (Numeric 4,3 auf 6,4) - und weil es schnell gehen musste und man auf die schnelle den Befehl nicht auswendig kannte, griff man die Systemtabellen an und hat Länge und Genauigkeit verwechselt - mit dem Erfolg dass nach dem "Update" nichts mehr ging: Keine Datensicherung, Programm nicht mehr usw....

Mit einem Alter Domain wäre man gar nicht in Versuchung geraten die Zahlen falsch rum einzutragen und wäre zudem von den Firebird-Internas geschützt geworden.

Aber: Keine Frage, dass in manchen Situationen der Zugriff auf die Systemtabellen hilfreich ist....

Ich würde jetzt auch nicht annehmen, dass die Erstellung von Generatoren durch eine StoredProcedure Probleme nach sich zieht, aber ich denke das Konzept ist dennoch nicht gut, weil die Anzahl der Generatoren in Firebird begrenzt ist:

http://www.firebirdsql.org/manual/de...sqlsyntax.html

auch dann, wenn es aktuell danach aussieht, dass die gut 600 Jahre ausreichen würden.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.877 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 12:07
Ab FireBird 3 kann man die Systemtabellen nicht mehr direkt manipulieren.
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

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

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 11:03
Ich verstehe den Sinn nicht, ein aufrufendes Programm (oder auch Trigger) muss dann ebenfalls noch umgeschrieben werden, um den neuen Generatornamen zu beherrschen?
Wenn schon dynamisches DDL, warum dann nicht ein Drop bzw. Reset des bestehenden Generators unter gleichem Namen?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 11:07
Hallo jobo,

weil der User auch nachträglich noch in eine vorherige Erfassungswoche wechseln kann. Im Moment benutzt das Programm eine ini-Datei, umden aktuellen Wert der Erfassungsnummer pro Woche/Jahr einzulesen und zu speichern. Das Programm läuft seid fast 10 Jahren so ohne Probleme. Der Kunde möchte jetzt aber Mehrbenutzerbetrieb und da will ich die Nummer durch die DB erzeugen lassen.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
jobo

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

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 11:22
weil der User auch nachträglich noch in eine vorherige Erfassungswoche wechseln kann.
Ok, wenn das nicht verkürzt dargestellt ist, wären eigentlich nur 2 Generatoren nötig.

Wäre es nicht am hübschesten, eine Funktion zu definieren, die das anhand eines Datumsparameters (oder KW Parameter) richtig ausspukt?

Zu dem Zitat von Jumpy:
Ich kann nur eine Idee anhand des Verhaltens von Oracle geben. Hier ist es so, dass DDL implizit ein Commit durchführt. Wenn also innerhalb ein Oracle Code Blocks ein DDL Statement aufgerufen wird, passiert "nichts schlimmes" außer halt ein Commit.
Wenn alles gut geht ist es wunderbar, wenn nicht hat man ein riesen Problem, weil ein Fehler oder ein explizites Roleback nur noch einen Teil der Transaktion zurückdreht. Vielleicht ist es bei FB ähnlich.
Deswegen gibt es diese Regel bei uns intern genauso wie bei Firebird. Wer erwischt wird, muss stramm stehen und sich wüßt beschimpfen lassen, bekommt die Haare abrasiert (wenn er noch keine Glatze hat) und muss für die Kollegen eine Woche Kaffee ausschenken.
Gruß, Jo
  Mit Zitat antworten Zitat
Hansa

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

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 11:29
Die Warnung ist doch klar : ein Generator eignet sich in keinster Weise dazu, Informationen ausser dem Generatorwert an sich, zu speichern. Es gibt noch nicht mal Transaktionssteuerung. Den lässt man einfach laufen und sonst in Ruhe. Hier wird jetzt versucht, dem Generator über seinen eigenen Namen irgendwelche Zusatzinformationen zu verschaffen.

Hier wurde auch schon mal empfohlen, einen Generator zur Erzeugung von fortlaufenden Nummern zu erzeugen. Das geht in ähnliche Richtung. Die Nr. kann ich doch auch in Tabelle speichern. Da steht dann eben nur ein Datensatz drin mit der Rechnungsnummer. Wen interessiert das denn ? Ich kann dann zumindest mal eine total falsche Rechnung schreiben, merke das, mache ein Rollback und fertig. Über Generator müsste ich die Datenbank umschreiben.

Roter Kasten sagt gerade : Mehrplatzbetrieb ! Um Gottes Willen, dann dreimal Finger weg von Generatoren ! *haarsträub*
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.877 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 11:32
Zitat:
Mehrplatzbetrieb ! Um Gottes Willen, dann dreimal Finger weg von Generatoren ! *haarsträub*
Mehrplatzbetrieb ist kein Problem für Sequenzen, wen GEN_ID() verwendet wird.
Markus Kinzler
  Mit Zitat antworten Zitat
Hansa

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

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 12:33
Zitat:
Mehrplatzbetrieb ist kein Problem für Sequenzen, wen GEN_ID() verwendet wird.
So meine ich das nicht. GEN_ID verschafft doch keine Transaktionssteuerng für einen Generator. Für Mehrplatz wird aber eine vernünftige Transaktionssteuerung gebraucht. Ansonsten fliegt einem bei jeder Gelegenheit die DB um die Ohren. Was ist denn wenn zwei Benutzer den gleichen Datensatz zur selben Zeit ändern oder löschen wollen ? Mit der richtigen Einstellung der Transaktions-Parameter lässt sich das schnell richtig realisieren. Zur erstbesten Gelegenheit die Transaktionssteuerung völlig unnötig zu umgehen ist meiner Meinung nach aber total falsch. Kann zwar gehen, wird aber ziemlich sicher Ärger bringen. Würde mich auch nicht wundern, wenn das in neueren FB-Versionen sogar unterbunden wird.

Mir fällt gerade ein, bei der Diskussion mit den fortlaufenden Rechnungsnummern, das warst ja auch Du, Markus, der Generatoren dafür empfohlen hat. War ähnliche Diskussion wie jetzt hier. Es könnte Spocki vielleicht helfen, statt des empfohlenen Generators genügt zumindest mir folgendes (zwar für Rechnungsnr., dürfte sich aber 1:1 übernehmen lassen, string verwenden o.ä.) :


Code:
CREATE TABLE RECNR (
    NR INTEGER);

CREATE OR ALTER PROCEDURE RECNR_SP
returns (
    recnr integer)
as
declare variable neuerecnr integer;
BEGIN
  NEUERECNR = -1;
  SELECT NR FROM RECNR INTO :NEUERECNR;
  IF (NEUERECNR < 0) THEN BEGIN
    INSERT INTO RECNR (NR) VALUES (1);
    RECNR = 1;
  END
  ELSE BEGIN
    UPDATE RECNR SET NR = NR + 1;
    RECNR = NEUERECNR + 1;
  END
  SUSPEND;
END^
Kommt ziemlich auf Generator/Trigger raus. In dem Fall hier hat die Tabelle RECNR einen einzigen Datensatz mit der letzten Nr. Mit der SP zähle ich die Nr. immer um 1 hoch und kann sie auch direkt per Delphi verwenden. Im Gegensatz zum Generator kann ich aber auch Rollback usw. machen.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 18:39 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