PDA

View Full Version : DB2 Identity ALLWAYS / BY DEFAULT



edi_box
20-03-13, 14:51
Wir wollen unsere DDS auf saubere SQL-Strukturen umstellen, damit die Datenbankzugriffe über c#-Connectoren 1:1 mit SQL-DB's sind.

Nun haben wir folgendes Problem:

Wenn wir die Identity-Spalte mit ALWAYS definieren, dann fahren wir mir Kontruckten wie "Insert into DB_neu select * from DB_alt" an die Wand. Gleiches Problem haben wir in einem RPG mit embedded SQL bei "insert into DB values( :ds_DB)" [Anm: :ds_DB ist eine externe DS bezogen auf die DB].

Wenn wir die Identity-Spalte mit BY DEFAULT definieren, haben wir die beiden obigen Probleme nicht, aber es wird keine Identity erzeugt, da der Werte des Identity-Feldes nicht DEFAULT ist.

Kann uns jemand einen Tipp geben, wie wir dieses Problem umgehen können?

Kann man z.B. per Trigger den Wert des Identity-Feldes auf DEFAULT [Anm: NULL und x'00' geht nicht] setzen, dann würde der BY DEFAULT sauber funktionieren.

Oder kann man bei ALWAYS Felder per Trigger o.ä. wegnehmen?

Alternative wäre eine Sequenz und die per Trigger zu übernehmen, dann bekommen wir aber mit IDENTITY_VAL_LOCAL() nicht die Ident zurück sondern müßen erst ein SQL-Statement nach schieben um per Select über den Unique-Key die ID wieder auslesen.

Vielen Dank für jeden Tipp

Edgar

andreaspr@aon.at
20-03-13, 15:01
Hallo,

du musst beim Insert einfach nur die IDENTITY-Spalte weglassen.

Insert Into Tab1 (Spalte2, Spalte3) Values ('Wert1', 'Wert2')

lg Andreas

edi_box
20-03-13, 15:35
Hallo Andreas,

Danke für die Antwort, dann muss ich aber das SQL-Statement im RPG per Hand zusammenbauen und es ist statisch.

Wenn man eine externe DS nimmt, machst Du einfach einen CLEAR, füllst Deine Felder und führst den "Insert into Db Values(E_DS)" und hast einen dynamischen Construct.


Edgar

andreaspr@aon.at
20-03-13, 16:29
Naja, RPG mach aus dem "Dynamischen" auch nix anderes als ein Statisches SQL wo die Felder aufgelöst werden.
Aber es stimmt schon, wenn ein neues Feld hinzugefügt wird, reicht es nicht einfach das Programm neu Umzuwandeln damit die DS aktualisiert wird.

Vielleicht gibt es ja möglichkeiten das IDENTITY Feld als Hidden zu definieren, dann könntest du es so machen.
Da auch in der DS das Hidden-Feld per default nicht definiert wird.
Habe ich aber ehrlich gesagt noch nie probiert ob das überhaupt möglich ist.

Ansonsten bleibt dir nix anderes übrich als die Spalten anzugeben.

lg Andreas

B.Hauser
20-03-13, 16:51
Da auch in der DS das Hidden-Feld per default nicht definiert wird.
Habe ich aber ehrlich gesagt noch nie probiert ob das überhaupt möglich ist.


Leider werden die Hidden-Felder auch in der Externen Datenstruktur integriert. SELECT * wählt die Felder nicht aus, beim Fetch in die Datenstruktur knallt es dann!

Eine Alternative wäre, eine View zu gernerieren, die alle Felder (außer dem Identity-Feld beinhaltet). Diese Datenstruktur wird dann anstatt der Struktur der Tabelle/physischen Datei verwendet.

Bei Datei-Erweiterung muss die View natürlich entsprechend angepasst werden. Ansonsten reicht dann eine Umwandlung der Programme.

Birgitta