Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2001.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Die Geheimnisse der GUID

Autor: Christoph Spielmann, Düsseldorf

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 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.

Handhabung einer GUID

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:

{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.

GUIDs erzeugen

Zum Erzeugen einer 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 (s. Abb. 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 (s. Abb. 2). Auch hier ist es wichtig, dass eine Komponente unter einer eindeutigen ID an-gesprochen werden kann.

Einsatz einer API-Funktion

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 (s. Abb. 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

Vorteile einer GUID

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.

Abb. 4: Fremdschlüssel müssen zum Einsatz mit GUIDs als Zahl mit der Feldgröße Replikations-ID formatiert werden.

Abb. 5: Der Einsatz von GUIDS vereinfacht das Einfügen relational verknüpfter Daten.

SELECT tblAdressen.*

FROM tblAdressen

WHERE AdresseID='{FDFFEDC3-E75B-4F60-A295-72EC6F3EB2DE}'

Quellcode 5

SELECT tblAdressen.*

FROM tblAdressen

WHERE tblAdressen.AdresseID = _

    {guid {FDFFEDC3-E75B-4F60-A295-72EC6F3EB2DE}}

Quellcode 6

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.