Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Generator Wert setzen (https://www.delphipraxis.net/212843-generator-wert-setzen.html)

TurboMagic 12. Apr 2023 10:25

Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC

Generator Wert setzen
 
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

Uwe Raabe 12. Apr 2023 10:38

AW: Generator Wert setzen
 
Bei Firebird wäre das wohl SET GENERATOR oder besser ALTER SEQUENCE

TurboMagic 12. Apr 2023 10:40

AW: Generator Wert setzen
 
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

Uwe Raabe 12. Apr 2023 10:43

AW: Generator Wert setzen
 
Wie wäre es mit GEN_ID(<generator name>, 0)?

TurboMagic 12. Apr 2023 11:06

AW: Generator Wert setzen
 
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

Uwe Raabe 12. Apr 2023 11:11

AW: Generator Wert setzen
 
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.

Delphi.Narium 12. Apr 2023 11:24

AW: Generator Wert setzen
 
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
SQL-Code:
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.

TurboMagic 12. Apr 2023 12:45

AW: Generator Wert setzen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 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