In einer alten Bestandsdatenbank habe ich teilweise 5 Felder (davon 3 String-Felder!) als PrimaryKeys.
Das Datenmodell würde ich als ziemlich fragwürdig bezeichnen, soll jetzt aber nicht weiter interessieren.
Im Rahmen der Programmierung habe ich so einige for-select-Durchläufe, bei denen ich in Subroutinen diverse Updates auf diese Datensätze ausführe, und zwar auch auf Datenfelder, die Bestandteil des PK sind.
Soviel ich weiß, ist doch innerhalb einer Session (Connection) rdb$db_key in jeder Tabelle eindeutig. Allerdings habe ich zu meinem Erschrecken festgestellt, dass rdb$db_key nach einem Update nicht mehr den gleichen Inhalt hat.
Wo liegt hier mein Denkfehler?
Ist rdb$db_key doch nicht eindeutig innerhalb einer aktiven Connection oder wird er dynamisch in Abhängigkeit des PK geändert? So jedenfalls ist er für mich nicht zu gebrauchen.
Nachtrag: Ich will wegen der Handlichkeit rdb$db_key als Pseudo-PK nutzen, um nicht 5 Felder in die Subroutinen übergeben zu müssen.
Verwendung von rdb$db_key
Moderator: martin.koeditz
- martin.koeditz
- Beiträge: 500
- Registriert: Sa 31. Mär 2018, 14:35
Der rdb$db_key ist in jedem Falle eindeutig innerhalb einer Transaktion. Dies hat etwas mit der Isolierung gegenüber anderen Transaktionen zu tun.
Datenbankintern wird durch den rdb$db_key die Adresse des Datensatzes gekennzeichnet. Der Primärschlüssel liegt hingegen im Speicher (Datenbank-Seite) und verweist auf den passenden rdb$db_key. Aus diesem Grunde ist die direkte Ansprache mittels rdb$db_key immer schneller als über einen Index.
Durch die Manipulation wird eine neue Version (rdb$record_version) des Datensatzes erstellt. Die Adresse sollte beim Update aber erhalten bleiben. Dies gilt jedoch nur innerhalb der Transaktion. Danach kann sich diese durch äußere Einflüsse jederzeit ändern.
Gruß
Martin
Datenbankintern wird durch den rdb$db_key die Adresse des Datensatzes gekennzeichnet. Der Primärschlüssel liegt hingegen im Speicher (Datenbank-Seite) und verweist auf den passenden rdb$db_key. Aus diesem Grunde ist die direkte Ansprache mittels rdb$db_key immer schneller als über einen Index.
Durch die Manipulation wird eine neue Version (rdb$record_version) des Datensatzes erstellt. Die Adresse sollte beim Update aber erhalten bleiben. Dies gilt jedoch nur innerhalb der Transaktion. Danach kann sich diese durch äußere Einflüsse jederzeit ändern.
Gruß
Martin
Martin Köditz
SynDesk SW GmbH
SynDesk SW GmbH
Nur mal ne Frage: Bist du sicher dass du eine Transaktion explizit startest oder verwendest du ggf. Autocommit?
Verwendet die SP ggf. eine eigene Transaktion?
Verwendet die SP ggf. eine eigene Transaktion?