![]() |
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 |
AW: Generator Wert setzen
|
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 |
AW: Generator Wert setzen
Wie wäre es mit GEN_ID(<generator name>, 0)?
|
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 |
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.
|
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:
einfügen, wobei dann <newval> der aktuelle Wert aus der Quelldatenbank ist.
ALTER SEQUENCE sequence-name RESTART WITH <newval>
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. |
AW: Generator Wert setzen
Danke schon mal an alle diese informationen Tipps.
In meiner trigger Definition habe ich noch das beruhigende gefunden:
Delphi-Quellcode:
=> der Trigger sollte nur dann einen Wert vom Generator abholen, wenn die
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; 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 11:05 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 by Thomas Breitkreuz