Home > Artikel > Ausgabe 11/2014 > Access-Systemtabellen

Access-Systemtabellen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Im Datenbankfenster oder im Navigationsbereich von Access mögen Ihnen die ausgegrauten Bezeichnungen von Tabellen mit dem Präfix MSys schon aufgefallen sein. Dabei handelt es sich um Systemtabellen, ohne die Access nicht funktionieren könnte. Reißen wir kurz an, was sich hinter diesen ominösen Tabellen verbirgt und wie Sie sie gar gewinnbringend für eigene Zwecke verwenden.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1412_Systemtabellen.accdb.

Wenn Sie unter Access eine Datenbank entwickeln, so sammeln sich Unmengen von Definitionsdaten an. Ob es sich um die Entwürfe von Tabellen oder Formularen handelt, das Anlegen von Beziehungen, oder den VBA-Code, für all diese Objekte sind Eigenschaften und Einstellungen zu speichern. Und das macht Access natürlich selbst wieder in Tabellen, die sich in der Diktion von Microsoft eben Systemtabellen nennen.

Ihre genaue Bedeutung, Funktionsweise und ihr Aufbau sind jedoch nicht dokumentiert, weshalb sich eine Menge von Access-Spezialisten um deren Aufklärung bemühte. Viel davon liegt noch im Verborgenen, weshalb es bisher noch keine Software gibt, die Access-Datenbanken in allen Details in ein anderes Format konvertieren könnte. Während die Office-Dateiformate etwa von Word und Excel seitens Microsoft weitgehend offen gelegt wurden, verschließt man sich bisher einer Dokumentation für das Access-Dateiformat.

Systemtabellen anzeigen

Alle Systemtabellen haben eines gemeinsam: Sie sind mit dem Tabellen-Präfix MSys ausgestattet und haben das Attribut System und Versteckt. Zwar lassen sie sich damit öffnen, jedoch weder im Entwurf ändern, noch bearbeiten. Datensätze können in der Regel nicht gelöscht oder hinzugefügt werden – Ausnahmen bestätigen die Regel.

Damit versteckte Objekte im Datenbankfenster oder Navigationsbereich angezeigt werden, sind unter Umständen ein paar Handgriffe nötig. Klicken Sie etwa auf die Titelzeile des Navigationsbereichs rechts und betätigen Navigationsoptionen....

Im nun erscheinenden Dialog haken Sie die Optionen Systemobjekte anzeigen und Ausgeblendete Objekte anzeigen an. Erst dann werden die Systemtabellen als graue Einträge aufgelistet, wie in Bild 1, wo Sie der Übersicht halber in eine eigene Navigationsgruppe verfrachtet wurden.

MSys-Systemtabellen

Bild 1: MSys-Systemtabellen

Der Umfang dieser Systemtabellen hat sich über die Access-Versionen hinweg immer wieder geändert. Viele sind erst in den neueren Versionen hinzugekommen, andere wieder sind inzwischen weggefallen, weil sich die Funktionalität von Access umgekrempelt hat.

Manche sind grundsätzlich in allen Datenbanken zu finden, andere entstehen erst, wenn bestimmte Vorgänge in der Datenbank angestoßen werden. Auch die Relevanz ist unterschiedlich zu bewerten. Im Folgenden geht es daher um jene Tabellen, die besonders wichtig sind und außerdem jene, die sich für eigene Zwecke – sprich: Abfragen – verwenden lassen.

MSysObjects

Hier handelt es sich um eine immer präsente Systemtabelle, die ganz entscheidend ist, weil sie den Katalog der Objekte einer Datenbank enthält. Ganz egal, was Sie in Ihre Datenbank einbauen oder importieren, es dazu wird immer als Datensatz in der Tabelle erscheinen. Den Aufbau sehen Sie in Bild 2, und in Bild 3 ausschnittsweise die Anzeige in der Datenblattansicht (Beispieldatenbank). Jeder Datensatz beschreibt ein einzelnes Objekt. Die Erklärung der Felder in der Reihenfolge ihrer Bedeutung:

Datenblattansicht der Systemtabelle MSysObjects; einige irrelevante Spalten sind ausgeblendet

Bild 2: Datenblattansicht der Systemtabelle MSysObjects; einige irrelevante Spalten sind ausgeblendet

Systemtabelle MSysObjects

Bild 3: Systemtabelle MSysObjects

  • Name ist die Bezeichnung des Objekts, wie Sie oder Access selbst sie für ein Objekt vergeben haben. In der Abbildung ist etwa das Formular frmBestellungenChart markiert.
  • Id ist der Primärschlüssel des Datensatzes, der das Objekt damit eindeutiger kennzeichnet, als der Name.
  • Type charakterisiert den Typ des Objekts, wobei hier Zahlenwerte verwendet werden. Der Wert -32768 etwa bedeutet immer Formular, eine 1 Tabelle, oder 4 eine verlinkte Tabelle. In der Tabelle tblObjektTypen der Beispieldatenbank finden Sie eine Aufstellung der wichtigsten Objekte und deren Typwerte.
  • DateCreate, DateUpdate. Hier sind Erstell- und Änderungsdatum des Objekts festgehalten.
  • Connect ist ein String, der nur dann angegeben ist, wenn es sich beim Objekt um eine verknüpfte Tabelle handelt. Für Verknüpfungen zu Access-Datenbanken steht hier der Pfad zur Access-Datei, bei ODBC-Tabellen die Datenquelle oder deren Definition.
  • ForeignName füllt sich ebenfalls nur bei verlinkten Tabellen. Dann steht hier der Tabellenname der Fremddatenbank, der ja vom Verknüpfungsnamen (Name) abweichen kann.
  • Flags braucht eigentlich nicht weiter zu interessieren. Es ist eine Kombination von Attributkonstanten für ein Objekt, deren Anteile noch nicht aufgeklärt sind. Ob ein Objekt etwa versteckt ist, wird jedenfalls hier indiziert.

Bei den Lv-Feldern geht es um binäre Daten, die eine proprietäre Satzbeschreibung haben, deren Aufbau weitgehend unbekannt ist und deren Bedeutung je nach Objekttyp variiert.

Meist sind hier zusätzliche Interna und Eigenschaften des Objekts gespeichert. LvProp aber beschreibt die angelegten Eigenschaften eines Objekts, welche auch über die Properties-Auflistung eines Objekts in VBA zu erhalten sind.

ParentId ist ein Verweis auf einen anderen Datensatz der Tabelle. Imgrunde ist sie rekursiv angelegt. Betrachten Sie die ParentId des Formulars frmBestellungenChart, so verweist sie auf den Datensatz mit der gleichwertigen Id und dem Namen Forms. Hier handelt es sich nicht um ein reales Objekt, sondern um ein Auflistungsobjekt – quasi die Kategorie des Objekts. Mithilfe der ParentID kann also im Verein mit Type die Zugehörigkeit eines Datenbankobjekts zu einer Objektkategorie festgestellt werden.

Die weiteren Felder der Systemtabelle haben nur Bedeutung im Zusammenhang mit ODBC-Datenbanken; wir schenken ihnen an dieser Stelle keine weitere Beachtung.

MSysObjects auswerten

Die Daten der Systemtabelle können unter keinen Umständen direkt verändert werden, aber als Grundlage für lesende Abfragen ist sie selbstverständlich nutzbar.

Normalerweise gelangen Sie an die Liste der in der Datenbank enthaltenen Tabellen nur über VBA und die Bibliothek DAO, indem entweder die TableDefs- oder die Containers-Auflistung durchlaufen wird. Durch MSysObjects wird das viel einfacher. Legen Sie eine Abfrage an, fügen die Systemtabelle ein und filtern Sie sie nach dem Wert von Type, wobei als Kriterium =1 einzutragen wäre. Oder listen Sie alle Formulare der Datenbank auf, indem Sie als Kriterium für Type die -32.768 angeben. In Bild 4 sehen Sie Entwurf und SQL-Ausdruck dieser Abfrage, sowie das Ergebnis. Eine alternative Abfrage, die zum gleichen Ergebnis führt, zeigt Bild 5, wo die Hilfstabelle tblObjektTypen herangezogen wird. Auf ähnliche Weise können Sie mit MSysObjects alle anderen Objekttypen abfragen.

Alternative Abfrage zur Auflistung der Formulare

Bild 4: Alternative Abfrage zur Auflistung der Formulare

Formulare der Datenbank über MSysObjects auswerten und anzeigen

Bild 5: Formulare der Datenbank über MSysObjects auswerten und anzeigen

Interessant ist auch die Reihenfolge, in der die Objekte einer Datenbank angelegt wurden. Sortieren Sie MSysObjects einfach aufsteigend nach DateCreate und Id. Sie werden finden, dass in allen Datenbanken MSysObjects an oberster Stelle steht, gefolgt anderen Systemtabellen und den Objekt-Containern, die alle dasselbe Datum aufweisen.

MSysAccessStorage

Das ist die zweite wichtige Systemtabelle jeder Datenbank, wobei diese mindestens im Access 2003-Format vorliegen muss. In früheren Versionen existiert sie noch nicht. Das frühere Pendant wäre die MSysAccessObjects, deren Aufbau jedoch grundlegend anders und komplizierter ist und deshalb hier nicht erläutert wird.

In MSysAccessStorage (siehe Bild 6) werden alle Objekte selbst und deren Eigenschaften gespeichert – mit Ausnahme der Tabellen und Abfragen. Ihr Inhalt ist abermals rekursiv, was bedeutet, das ein Datensatz über ParentId auf einen anderen verweisen kann.

Die Systemtabelle MSysAccessStorage: Binär-Container für Objekte

Bild 6: Die Systemtabelle MSysAccessStorage: Binär-Container für Objekte

Die Verschachtelung ist allerdings tiefer, als bei MSysObjects. Ein Datensatz in ihr kann entweder ein Objekt selbst darstellen – dann hat Type den Wert 2 –, oder eine Art Verzeichnis – Type zeigt 1. Die Objekteinträge enthalten in der Spalte Lv in der Regel einen Binärwert, und das ist das eigentliche Objekt. Sein Inhalt hängt vom Objekttyp ab, ist von proprietärem Aufbau und bisher nirgendwo dokumentiert.

Auch in dieser Tabelle finden sich Angaben zu Erstell- und Änderungsdatum des Objekts. Die Spalte Name bedarf der Erläuterung: Hier sind die Objekte nicht so benannt, wie in der Datenbank selbst, sondern über Zahlenwerte indiziert. Eine Zuordnung vom Namen in MSysObjects zu diesen Werten gibt es nicht direkt. Sie findet intern über die DirData-Einträge statt.

Mit dieser Systemtabelle kann man als Entwickler nicht viel anfangen. Damit jedoch die Rekursion der Datensätze einmal verdeutlicht wird, sehen Sie in Bild 8 das Ergebnis einer Abfrage qry_SysStorage, die über Unterdatenblätter die Baumstruktur abbildet.

Ergebnis der rekursiven Anzeige von qry_SysStorage

Bild 7: Ergebnis der rekursiven Anzeige von qry_SysStorage

Ihre Definition ist extrem kurz:

SELECT * FROM MSysAccessStorage;

Der Clou aber ist, dass in den Eigenschaften der Abfrage (Bild 7), die Abfrage selbst als Unterdatenblatt angegeben und dabei die ParentID mit der Id der Datensätze verknüpft ist. Durch diese Konstruktion klinkt sich die Abfrage immer wieder selbst mit beliebiger Tiefe als Unterdatenblatt zu einem Datensatz ein, wenn dieser Kind-Elemente aufweist.

Abfrage qry_SysStorage zur Anzeige der Rekursion in MSysAccessStorage

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!