AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Generator Wert setzen

Ein Thema von TurboMagic · begonnen am 12. Apr 2023 · letzter Beitrag vom 12. Apr 2023
Antwort Antwort
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.936 Beiträge
 
Delphi 12 Athens
 
#1

Generator Wert setzen

  Alt 12. Apr 2023, 11:25
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC
Hallo,

angenommen, ich muss die Werte einer Datenbank in eine neue leere kopieren und
diese Datenbanken benutzen für ein paar der Schlüsselfelder jeweils einen Generator.

Wie bekomme ich das in der Ziel Datenbank hin, dass deren generatoren dann wieder die
selben Werte haben, die die Generatoren der Quelldatenbank zum zeitpunkt des Kopierens
haben?

Kann ich den Generator Wert irgendwie Programm gesteuert ändern?
Irgendwelche DB Management Tools können sowas ja, aloso muss sowas irgendwie gehen.
Google hat aber zumindest auf die Schnelle nichts brauchbares ausgespuckt.

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#2

AW: Generator Wert setzen

  Alt 12. Apr 2023, 11:38
Bei Firebird wäre das wohl SET GENERATOR oder besser ALTER SEQUENCE
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.936 Beiträge
 
Delphi 12 Athens
 
#3

AW: Generator Wert setzen

  Alt 12. Apr 2023, 11:40
Hallo,

danke, ja das klingt shcon mal gut.
Gibt's auch noch (in der Übersicht der DDL Statements hab' ich nichts offensichtliches gesehen)
eine Möglichkeit den aktuellen Wert abzufragen, möglichst ohne den zu ändern?

Grüße

TurboMagic
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#4

AW: Generator Wert setzen

  Alt 12. Apr 2023, 11:43
Wie wäre es mit GEN_ID(<generator name>, 0)?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.936 Beiträge
 
Delphi 12 Athens
 
#5

AW: Generator Wert setzen

  Alt 12. Apr 2023, 12:06
Jetzt wird's vermutlich noch das kleine Problem geben, dass auch in der neuen leeren Datenbank
ja der Generator schon vorbereiteterweise der entsprechenden Primary Key Spalte zugewiesen ist
und somit beim Einfügen der zu kopierenden Werte zuschlägt.

Oder umgehe ich das, wenn ich im Insert explizit auch diese Spalte angebe und auf den Wert aus
der Quell DB setze?

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#6

AW: Generator Wert setzen

  Alt 12. Apr 2023, 12:11
Bei FireDAC hat ein TFDAutoIncField das Property IdentityInsert, mit dem du das steuern kannst. Bei Firebird sollte der Trigger, der den Generatorwert einträgt, natürlich prüfen ob nicht schon ein Wert drin steht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Generator Wert setzen

  Alt 12. Apr 2023, 12:24
In dem Fall würd' ich die Tabelleninhalte komplett übernehmen, incl. der ID und nach der Übernahme den Startwert des Generators auf Max(ID) + 1 setzen.

Ansonsten kommt es etwas darauf an, wie denn der Generatorwert zugewiesen wird.

Z. B. in einem Datenbanktrigger?

Die einfachste Methode für die Datenübernahme dürfte das Generieren von Insertscripten sein und die dann in der neuen Datenbank ausführen. Da kann man dann am Ende der Scripte auch direkt die Zeile ALTER SEQUENCE sequence-name RESTART WITH <newval> einfügen, wobei dann <newval> der aktuelle Wert aus der Quelldatenbank ist.

Datenbanktrigger, Generatoren, Sequenzen, .. werden erst nach dem vollstängigen Import der Daten per SQL-Insert-Scripte aktiviert, dann können die auch nicht versehentlich die Daten verändern, was ja unweigerlich zu einem Abweichen der Zieldatenbank von der Quelldatenbank führen würde.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.936 Beiträge
 
Delphi 12 Athens
 
#8

AW: Generator Wert setzen

  Alt 12. Apr 2023, 13:45
Danke schon mal an alle diese informationen Tipps.
In meiner trigger Definition habe ich noch das beruhigende gefunden:

Delphi-Quellcode:
CREATE TRIGGER BI_MYTRIGGER_TEST_KEYCOLUMN FOR MYTRIGGER_TEST
ACTIVE BEFORE
  INSERT
POSITION 0
AS
BEGIN
  IF (NEW.KEY_ID IS NULL) THEN
      NEW.KEY_ID = GEN_ID(MYGENERATOR_GEN, 1);
END;
=> der Trigger sollte nur dann einen Wert vom Generator abholen, wenn die
Schlüsselspalte nicht NULL ist. Beim Kopieren kann der Primary Key ja nicht
NULL sein, also sollte ich da keine Probleme haben.

Ich versuch' mich jetzt mal an einer Umsetzung...

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort


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:27 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