Die Vergabe von Primärschlüsseln spielt bei der Definition von Tabellen eine zentrale Rolle. Bei modernen Datenbankanwendungen hat es sich inzwischen durchgesetzt, anstelle von (teilweise kombinierten) Merkmalen eines Datensatzes einen numerischen Primärschlüssel zu verwenden. Dies belegt zwar zusätzlichen Speicherplatz, vereinfacht aber die Datenabfrage und damit die Entwicklung von Anwendungen erheblich. Einen noch größeren Vorteil verschafft Ihnen der Einsatz von Access GUIDs.
Bei einer GUID (Globally Unique Identifier) handelt es sich im Prinzip um eine normale Zahl, die jedoch nicht wie die normalen AutoWert-Felder von Access 4 Byte an Speicherplatz, sondern insgesamt 16 Byte belegt. Der Vorteil besteht darin, dass eine 16 Byte große Zahl einen sehr großen Wertebereich abdeckt.
Eine GUID macht sich diesen Vorteile zunutze, um eine „in Zeit und Raum“ eindeutige Nummer zu vergeben. Microsoft sichert beispielsweise zu, dass eine einmal generierte GUID auf der Welt nicht ein zweites Mal generiert wurde oder wird.
Um dies sicherzustellen, besteht eine GUID aus mehreren Teilen. Einer dieser Teile ergibt sich hierbei aus der physikalischen Hardware-Adresse Ihrer Ethernet-Netzwerkkarte. Da diese Hardware-Adresse weltweit eindeutig vergeben und auf jeder Netzwerkkarte unterschiedlich ist, ist auch eine GUID, die auf dieser Adresse basiert, immer eindeutig.
Sollte in Ihrem Rechner keine Ethernet-Karte eingebaut sein, ermittelt Ihr PC einmalig eine Zufallszahl als Basis. Bei dieser Zufallszahl ist der Wertebereich so groß, dass die Wahrscheinlichkeit einer doppelten GUID extrem gering ist.
Ein anderer Teil der GUID wird fortlaufend hoch gezählt, sodass hier eine doppelte Vergabe ausgeschlossen ist.
Bereits normale AutoWert-Zahlen haben aufgrund des 32-Bit (= 4 Byte)-Speicherbedarfs einen Wertebereich von -2.147.483.648 bis +2.147.483.648. Würde ein Bit mehr zur Verfügung stehen, dann würde sich der Wertebereich verdoppeln. Bei GUIDs stehen nun aber insgesamt 16 mal 8, also insgesamt 128 Bit zur Verfügung. Im Vergleich zum AutoWert-Datentyp muss der Wert also 96 (=128 – 32) mal verdoppelt werden, was einen enorm großen Wertebereich ergibt.
Damit entsprechend große Zahlen überhaupt noch handhabbar sind, werden GUIDs nicht als Zahlen, sondern aus einer Kombination aus Zahlen und Texten dargestellt, die zusätzlich noch durch Striche abgegrenzt sind. Dies macht eine GUID für Menschen leichter lesbar. Für Fachleute: Die Darstellung erfolgt im Hexadezimalsystem.
Eine typische GUID hat beispielsweise das folgende Aussehen:
Bild 1: Die Feldgröße Replikations-ID bereitet ein Feld für die Aufnahme von GUIDs vor.
Bild 2: Das Windows-Betriebsystem macht ebenfalls intensiv von GUIDs Gebrauch, wie ein Blick auf den Registry-Editor von Windows verrät.
{A6BA6E08-59CD-4724-9E71-0680DBE6FD11}
Jeweils ein Wertepaar stellt ein Byte dar, sodass die GUID aus insgesamt 32 Buchstaben bzw. Zahlen besteht. Die Gruppierung der Bytes mit Hilfe der Bindestriche erfolgt nach dem folgenden Schema:
4-2-2-2-6
Dabei steht die Zahl 4 beispielsweise für vier Bytes, also insgesamt acht Werte.
Zusätzlich sind GUIDs in der Regel von geschweiften Klammern eingerahmt, was die Identifikation vereinfacht.
Zum Erzeugen einer Access GUID gibt es prinzipiell zwei Möglichkeiten. Die erste Möglichkeit besteht darin, dass Sie innerhalb einer Access-Tabelle als Datentyp AutoWert auswählen. Anschließend ändern Sie die Feldgröße-Eigenschaft von Long Integer in Replikations-ID ab (siehe Bild 1). Dies führt dazu, dass Access nun bei der Anlage eines neuen Datensatzes automatisch eine neue GUID generiert und diese in das Feld einträgt.
Die zweite Möglichkeit besteht darin, eine GUID mit Hilfe einer Betriebssystem-Funktion erzeugen zu lassen und nachträglich in die Tabelle einzutragen. Wie Sie später noch sehen werden, besteht der Vorteil dieser Lösung darin, dass Sie den Primärschlüsselwert eines neuen Datensatzes bereits kennen, bevor Sie den Datensatz angelegt haben.
Die entsprechenden Funktionen zum Erzeugen einer GUID sind fest im Windows-Betriebs-system verankert. Dies ist unter anderem deshalb der Fall, da GUIDs nicht nur im Datenbankbereich eingesetzt, sondern beispielsweise auch von Windows zur Verwaltung von Komponenten benötigt werden (siehe Bild 2). Auch hier ist es wichtig, dass eine Komponente unter einer eindeutigen ID an-gesprochen werden kann.
Zur Erzeugung einer GUID mit Hilfe der Betriebssystem-Funktionen kommen API-Funktionsaufrufe zum Einsatz, die wie in Quellcode 1 deklariert werden.
Private Declare Function CoCreateGuid Lib "ole32.dll" (tGUIDStructure As GUID) As Long Private Declare Function StringFromGUID2 Lib "ole32.dll" (rGUID As Any, _ ByVal lpstrClsId As Long, ByVal cbMax As Long) As Long Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As String * 1 End Type Quellcode 1 Function CreateGUID() As String Const clLen As Long = 50 Dim sGUID As String Dim tGUID As GUID Dim bGuid() As Byte Dim lRtn As Long If CoCreateGuid(tGUID) = 0 Then bGuid = String(clLen, 0) lRtn = StringFromGUID2(tGUID, VarPtr(bGuid(0)), clLen) If lRtn > 0 Then sGUID = Mid$(bGuid, 1, lRtn - 1) End If CreateGUID = sGUID End If End Function Quellcode 2
Die erste API-Funktion generiert eine neue GUID und die zweite Funktion formatiert diese GUID als Text.
Zusätzlich ist die Definition des Datentyps GUID mit der Private Type-Anweisung erforderlich.
Diese drei Elemente werden von der Funktion CreateGUID verwendet, deren Aufbau Sie in Quellcode 2 finden.
Die fertige Funktion finden Sie auch in der Beispieldatenbank zu diesem Beitrag.
Den Einsatz der Funktion testen Sie beispielsweise im Direktfenster durch Eingabe der folgenden Anweisung (siehe Bild 3):
CreateGUID()
Als Ergebnis liefert die Funktion eine als Zeichenkette formatierte GUID zurück.
Abb. 3: Die Funktion CreateGUID erzeugt mit Hilfe von API-Funktionsaufrufen eine neue GUID. Sub AdressanlagePerSQL() Dim SQL As String Dim AdresseID As String AdresseID = CreateGUID() SQL = "INSERT INTO tblAdressen" SQL = SQL & " VALUES (" SQL = SQL & "''" & AdresseID & "''," SQL = SQL & "''Müller'', ''Hans''," SQL = SQL & "''40211'', ''Düsseldorf''" SQL = SQL & ")" CurrentProject.Connection.Execute SQL End Sub Sub AdressanlagePerSQL() Dim SQL As String Dim AdresseID As String Dim ProjektID As String AdresseID = CreateGUID() SQL = "INSERT INTO tblAdressen" SQL = SQL & " VALUES (" SQL = SQL & "''" & AdresseID & "''," SQL = SQL & "''Müller'', ''Hans''," SQL = SQL & "''40211'', ''Düsseldorf''" SQL = SQL & ")" CurrentProject.Connection.Execute SQL ProjektID = CreateGUID() SQL = "INSERT INTO tblProjekte" SQL = SQL & " VALUES (" SQL = SQL & "''" & ProjektID & "''," SQL = SQL & "''" & AdresseID & "''," SQL = SQL & "''Entwicklung einer EDV-Lösung''" SQL = SQL & ")" CurrentProject.Connection.Execute SQL End Sub
Wie bereits erwähnt, ist ein wesentlicher Vorteil beim Einsatz einer GUID die Tatsache, dass Sie einen Primärschlüsselwert noch vor der Anlage des Datensatzes kennen.
Dies macht sich zum Beispiel bei der Anlage eines neuen Datensatzes per SQL vorteilhaft bemerkbar, wie der Programmausschnitt aus Quellcode 3 zeigt.
Im ersten Schritt wird eine Variable als String definiert, der mit Hilfe der CreateGUID-Funktion eine neue GUID zugewiesen wird. Diese wird dann mit der SQL-Anweisung Insert sowie anderen Werten in eine Adresstabelle eingefügt.
Wenn Sie nun zur Adresse einen Detaildatensatz in einer anderen Tabelle anlegen möchten, ist Ihnen bereits der Primärschlüssel der neu angelegten Adresse bekannt.
Das erweiterte Beispiel aus Quellcode 4 legt zuerst eine Adresse und danach einen neuen Datensatz in der Projekttabelle an, die mit der Adresstabelle verknüpft ist.
Damit die Anweisung einwandfrei funktioniert, darf der Primärschlüssel der Tabelle natürlich kein AutoWert sein. Wählen Sie stattdessen also Datentyp Zahl aus und geben Sie als Feldgröße Replikations-ID an.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo