Einzelnen Beitrag anzeigen

Hansa

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

AW: Int-Feld nachträglich auf autoincrement setzen

  Alt 19. Sep 2012, 11:01
Ist es häufig ratsam, die technischen Schlüssel von den fachlichen Schlüsseln zu trennen.

Ich verfahre auch gelegentlich wie DeddyH es beschrieben hat.
Erstens hat DeddyH zwei verschiedene Methoden beschrieben. In dem einen Fall wird der Generatorwert eben nur dann hochgezählt, wenn noch keine ID da ist. Dann bin ich echt verblüfft, dass es sogar möglich ist mit "normalen" Wörtern Verwirrung zu stiften.

Was soll sich Otto-Normaluser unter einem "technischen und einem fachlichen Schlüssel" vorstellen? Oder was ist das ? "die Anwendung sollte sich für den Anwender transparent verhalten". Das sind lediglich Schlagwörter, die einem vorgaukeln, einer wisse schon was er sagt. Ich übersetze das mal so : zu jedem Datensatz gehört eine ID (könnte man "technischer Schlüssel" nennen), die der Endbenutzer allerdings weder sehen noch manipulieren soll (Transparenz ?). Im Programm selbst wird nur mit merkbaren Nummern hantiert (fachliche Schlüssel ?). Sprich : Artikel-Nr., Rechn.-Nr. usw. Man nimmt nun eine Art.-Nr. aber nicht, um sie in sämtlichen abhängigen Tabellen, z.B. Rechnungspositionen zu verwenden. Denn was passiert mit den Rechnungen, sofern sich eine Art.-Nr. ändert ?

Richtig. Im Falle, dass sich eine Art.-Nr. ändert müssen alle Rechnungspositionen angepasst werden (im Normalfall noch viel mehr). Also entkoppelt man die vermeintlich wichtige Art.Nr. vom Rest und behandelt sie als normales Feld (wie z.B. Preis, Artikel-Bez.). Macht man das so, dann braucht man aber trotzdem noch eine eindeutige Identifikationsnr. für einen Datensatz, also eine ID. Denn die ist auch dann eindeutig, wenn sich das Feld "Art.-Nr." ändert.

Jetzt wären wir beim Fall "Int-Feld nachträglich auf autoincrement setzen". Sofern das um eine ID geht, dann nützen Generatoren/Trigger zuerst mal gar nichts. Denn die ID ist ja schon vorhanden. Wie bei meinem Beispiel Importieren von Fremddaten. Der ID-Wert muss dann auf einen vernünftigen Anfangswert gesetzt werden. Erst dann kann der Trigger ohne Kollisionen aktiv werden.

So etwas hilft da auch nur halb :

Delphi-Quellcode:
set term ^;
CREATE TRIGGER Table1_BI FOR T1
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  if (NEW.ID is NULL) then
    NEW.ID = GEN_ID(GEN_Table1_ID, 1);
END!!
set term ;^
Da wird die ID zwar nur hochgezählt, wenn die ID noch nicht bekannt ist, aber was, wenn die neu erzeugte per Insert in die Tabelle eingefügt werden soll, aber bereits da ist ?
Gruß
Hansa

Geändert von Hansa (19. Sep 2012 um 11:05 Uhr)
  Mit Zitat antworten Zitat