{"id":55000698,"date":"2010-02-01T00:00:00","date_gmt":"2020-05-22T22:10:09","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=698"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"SQLDatenbankschema_auslesen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/","title":{"rendered":"SQL-Datenbankschema auslesen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/2db6f33a5df94be59d6a7b0529bec030\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Unter dem SQL-Datenbankschema verstehen wir eine Reihe von SQL-Anweisungen, mit denen Sie Tabellen oder auch eine komplette Datenbank erstellen k&ouml;nnen. Dazu geh&ouml;ren beispielsweise die CREATE TABLE- oder CREATE INDEX-Anweisungen. Da man diese Befehle eher selten einsetzt, kann eine L&ouml;sung zum automatischen Erstellen des Schemas einer oder mehrerer Tabellen nicht schaden. Der vorliegende Beitrag zeigt, wie es funktioniert.<\/b><\/p>\n<p>Access macht es dem Entwickler leicht: Mit der Tabellenentwurfs-Ansicht, dem Indizes-Fenster und dem Beziehungen-Fenster bietet es uns drei M&ouml;glichkeiten, Tabellen und deren Beziehungen ganz einfach anzulegen. Im Tabellenentwurfsfenster erfassen wir die grundlegenden Daten wie die Felder mit ihren Datentypen und weitere Eigenschaften, im Indizes-Fenster verwalten wir einfache und zusammengesetzte Indizes und das Beziehungen-Fenster dient schlie&szlig;lich dazu, die Beziehungen zwischen den Tabellen anzulegen.<\/p>\n<p>Im Hintergrund r&ouml;delt Access ganz ordentlich und stellt die SQL-Anweisungen zusammen, welche die von uns angelegten Tabellen und Felder und auch &auml;nderungen an bestehenden Elementen zur Ausf&uuml;hrung an die JET-Engine weitergeben.<\/p>\n<p>Solche Ausdr&uuml;cke k&ouml;nnen Sie mit der L&ouml;sung des vorliegenden Beitrags selbst erstellen: Sie brauchen einfach nur das Formular aus Bild 1 zu &ouml;ffnen und die gew&uuml;nschte Tabelle auszuw&auml;hlen, schon erscheinen die SQL-Ausdr&uuml;cke zum Erstellen dieser Tabellen mit den gebr&auml;uchlichsten Eigenschaften im Formular.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Datenbankschema-web-images\/pic005_opt.jpeg\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Durch Ausw&auml;hlen einer Tabelle erhalten Sie den SQL-Ausdruck, um diese zu erstellen.<\/span><\/b><\/p>\n<p><b>Grundlagen<\/b><\/p>\n<p>SQL verwenden Sie ja normalerweise, um Abfragen f&uuml;r die Auswahl von Daten zu definieren oder auch zum Ausf&uuml;hren von Aktionsabfragen. Dieser Teil von SQL nennt sich <b>Data Manipulation Language <\/b>(<b>DML<\/b>). F&uuml;r den vorliegenden Beitrag brauchen wir allerdings eine andere SQL-Teilmenge, n&auml;mlich die <b>Data Definition Language <\/b>(<b>DDL<\/b>). Sie enth&auml;lt Befehle wie die oben bereits erw&auml;hnten <b>CREATE TABLE&#8230;<\/b>&#8211; oder <b>CREATE INDEX&#8230;<\/b>-Anweisungen. Mit ein wenig Einarbeitung k&ouml;nnen Sie mit diesen Befehlen Tabellen und Beziehungen sicher genauso schnell, wenn nicht noch schneller als mit den Elementen der Benutzeroberfl&auml;che erstellen.<\/p>\n<p>Da die meisten von uns bequem sind, wird das aber kaum jemand tun. Dennoch kommt es vor, dass man eine oder mehrere SQL-Anweisungen zum Anlegen von Tabellen ben&ouml;tigt &#8211; beispielsweise, wenn Sie eine Tabelle per VBA-Code erstellen m&ouml;chten. Dabei kann es sich um eine tempor&auml;re Tabelle handeln, die nur kurzzeitig ben&ouml;tigt und dann wieder gel&ouml;scht wird, zum Beispiel um zu importierende Daten vor dem Weiterverarbeiten zwischenzulagern. Oder Sie bauen einen Assistenten oder ein Tool, das per Mausklick Tabellen in Ihren Datenbanken anlegen soll. Dies ist zum Beispiel &auml;u&szlig;erst praktisch, wenn Ihre Datenbankanwendung immer wiederkehrerende Tabellen wie etwa eine <b>Anreden<\/b>-Tabelle enthalten soll.<\/p>\n<p>Ziel der nachfolgend vorgestellten Prozeduren ist es, auf Basis bestehender Tabellen SQL-Abfragen zu erzeugen, mit denen Sie die Tabellen nachbauen k&ouml;nnen. F&uuml;r eine einfache Tabelle mit einem Prim&auml;rschl&uuml;sselfeld namens <b>AnredeID <\/b>und einem weiteren Textfeld namens <b>Anrede <\/b>mit einer Feldgr&ouml;&szlig;e von 255 Zeichen ben&ouml;tigen Sie beispielsweise die folgenden beiden Zeilen:<\/p>\n<pre>CREATE TABLE tblAnreden([AnredeID] COUNTER, [Anrede] CHAR(255));\r\nCREATE UNIQUE INDEX [PrimaryKey] ON [tblAnreden]([AnredeID]) WITH PRIMARY DISALLOW NULL;<\/pre>\n<p>Das Ganze lie&szlig;e sich auch mit einer einzigen Zeile erledigen, und zwar so:<\/p>\n<pre>CREATE TABLE tblAnreden([AnredeID] COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, [Anrede] CHAR(255));<\/pre>\n<p>Warum wir in der nachfolgend beschriebenen L&ouml;sung die erste Variante verwenden, erfahren Sie weiter unten. Eine ganze Menge Informationen zu den Befehlen der <b>Data Definition Language <\/b>erhalten Sie im Beitrag <b>Datenbanken und Tabellen per SQL anpassen <\/b>(Shortlink 609).<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">DAO als Werkzeug zum Auslesen von Tabellen-, Feld- und Beziehungsinformationen<\/p>\n<p>Bevor wir uns um das Erstellen der SQL-Anweisungen k&uuml;mmern k&ouml;nnen, brauchen wir M&ouml;glichkeiten, die Struktur der Tabellen, Felder und Beziehungen auszulesen.<\/p>\n<p>Wie aber soll dies gelingen &#8211; welche Bibliothek bietet Zugriff auf den Entwurf einer Datenbank Es handelt sich um die <b>DAO<\/b>-Bibliothek, die Sie f&uuml;r den Zugriff auf die Daten einer Datenbank sicher schon Hunderte Male genutzt haben. Die f&uuml;r uns interessante Struktur basiert auf dem <b>Database<\/b>-Objekt, das Sie normalerweise als Ausgangspunkt f&uuml;r die <b>OpenRecordset<\/b>&#8211; oder die <b>Execute<\/b>-Methode verwenden. In diesem Fall greifen wir auf dessen <b>TableDefs<\/b>-Auflistung zu, die den Zugriff auf alle Tabellen der Datenbank erlaubt. Ein <b>TableDef<\/b>-Objekt wiederum enth&auml;lt unter anderem die <b>Fields<\/b>-Auflistung, die wiederum die <b>Field<\/b>-Objekte und somit die Informationen &uuml;ber die Felder der entsprechenden Tabelle liefert. Au&szlig;erdem stellt das <b>TableDef<\/b>-Objekt die <b>Indexes<\/b>-Auflistung bereit, mit der wir die Indizes der angegebenen Tabelle auslesen k&ouml;nnen.<\/p>\n<p>Etwas weiter oben stellt das <b>Database<\/b>-Objekt neben der <b>TableDefs<\/b>-Auflistung auch noch die <b>Relations<\/b>-Auflistung bereit. Diese wiederum enth&auml;lt die <b>Relation<\/b>-Objekte mit allen Informationen zu den im Beziehungen-Fenster angelegten Beziehungen.<\/p>\n<p><b>Tabellendefinition auslesen<\/b><\/p>\n<p>Den Start macht die Funktion <b>GetCreateTableString <\/b>(s. Listing 1). Sie erwartet ein <b>TableDef<\/b>-Objekt mit einem Verweis auf die auszuwertende Tabelle und liefert eine Zeichenkette mit dem SQL-Ausdruck zum Erstellen der entsprechenden Tabelle zur&uuml;ck. Diese Zeichenkette enth&auml;lt die <b>CREATE TABLE<\/b>-Anweisung mit der Angabe des Namens der zu erstellenden Tabelle, die Feldliste sowie eventuell n&ouml;tige <b>CONSTRAINT<\/b>-Elemente zur Definition von Fremdschl&uuml;sselfeldern.<\/p>\n<p class=\"kastentabelleheader\">Listing 1: Zusammenstellen der SQL-Anweisung zum Erstellen einer Tabelle<\/p>\n<pre>Public Function GetCreateTableString(tdf As DAO.TableDef) As String\r\n    Dim db As DAO.Database\r\n    Dim fld As DAO.Field\r\n    Dim idx As DAO.Index\r\n    Dim rel As DAO.Relation\r\n    Dim strTable As String\r\n    Dim strSQL As String\r\n    Dim strSQLField As String\r\n    Dim strFieldType As String\r\n    Dim strConstraints As String\r\n    Set db = CurrentDb\r\n    strTable = tdf.Name\r\n    strSQL = &quot;CREATE TABLE &quot; &amp; strTable &amp; &quot;(&quot;\r\n    For Each fld In tdf.Fields\r\n        strSQLField = strSQLField &amp; &quot;[&quot; &amp; fld.Name &amp; &quot;]&quot;\r\n        strFieldType = GetFieldType(fld)\r\n        strSQLField = strSQLField &amp; &quot; &quot; &amp; strFieldType &amp; &quot;, &quot;\r\n    Next fld\r\n    strSQL = strSQL &amp; strSQLField\r\n    For Each idx In tdf.Indexes\r\n        If idx.Foreign Then\r\n            For Each rel In db.Relations\r\n                If rel.ForeignTable = tdf.Name And idx.Fields(0).Name = rel.Fields(0).Name Then\r\n                    strConstraints = strConstraints &amp; &quot;CONSTRAINT &quot;\r\n                    strConstraints = strConstraints &amp; &quot;[&quot; &amp; idx.Name &amp; &quot;] FOREIGN KEY (&quot;\r\n                    strConstraints = strConstraints &amp; &quot;[&quot; &amp; rel.Fields(0).Name &amp; &quot;]&quot;\r\n                    strConstraints = strConstraints &amp; &quot;) REFERENCES [&quot;\r\n                    strConstraints = strConstraints &amp; rel.Table &amp; &quot;]&quot;\r\n                    If (rel.Attributes And dbRelationUpdateCascade) = dbRelationUpdateCascade Then\r\n                        strConstraints = strConstraints &amp; &quot; ON UPDATE CASCADE&quot;\r\n                    End If\r\n                    If (rel.Attributes And dbRelationDeleteCascade) = dbRelationDeleteCascade Then\r\n                        strConstraints = strConstraints &amp; &quot; ON DELETE CASCADE&quot;\r\n                    End If\r\n                    strConstraints = strConstraints &amp; &quot;, &quot;\r\n                End If\r\n            Next rel\r\n        End If\r\n    Next idx\r\n    strSQL = strSQL &amp; strConstraints\r\n    If Right(Trim(strSQL), 1) = &quot;,&quot; Then\r\n        strSQL = Left(strSQL, Len(Trim(strSQL)) - 1)\r\n    End If\r\n    strSQL = strSQL &amp; &quot;);&quot;\r\n    GetCreateTableString = strSQL\r\nEnd Function<\/pre>\n<p>Um einen solchen Ausdruck zu erstellen, verwendet die Prozedur eine <b>String<\/b>-Variable namens <b>strSQL<\/b>, die nach und nach erweitert wird. Gleich zu Beginn schreibt die Prozedur den Ausdruck <b>CREATE TABLE <\/b>gefolgt von dem im Parameter angegebenen Tabellennamen und einer &ouml;ffnenden Klammer in diese Variable. Die &ouml;ffnende Klammer gibt den Startschuss f&uuml;r die folgende Feldliste ab. Diese stellt die Prozedur innerhalb einer <b>For Each<\/b>-Schleife zusammen, die alle <b>Field<\/b>-Elemente des <b>TableDef<\/b>-Objekts auf Basis der gew&uuml;nschten Tabelle durchl&auml;uft. Darin bedienen wir uns einer Hilfsvariablen namens <b>strSQLField<\/b>, welche die Feldliste aufnimmt. Zu jedem Element der Feldliste geh&ouml;rt der Name der Tabelle, der vorsichtshalber in eckigen Klammern eingefasst wird &#8211; auf diese Weise verhindern wir, dass Feldnamen mit Sonderzeichen zu Fehlern beim Ausf&uuml;hren der SQL-Anweisungen f&uuml;hren. Hinter dem Feldnamen folgt der Datentyp. Diesen ermittelt eine separate Funktion namens <b>GetFieldType <\/b>(s. Listing 2) &#8211; mehr dazu im Anschluss an die Beschreibung der aktuellen Funktion. Vorerst reicht uns die Information, dass <b>GetFieldType <\/b>beispielsweise f&uuml;r ein W&auml;hrungsfeld den Ausdruck <b>MONEY <\/b>zur&uuml;ckliefert.<\/p>\n<p class=\"kastentabelleheader\">Listing 2: Diese Funktion liefert eine SQL-kompatible Zeichenkette f&uuml;r den Datentyp eines Felds zur&uuml;ck.<\/p>\n<pre>Public Function GetFieldType(fld As DAO.Field) As String\r\nDim strFieldType As String\r\nSelect Case fld.Type\r\nCase dbLong\r\nIf (fld.Attributes And dbAutoIncrField) = 0 Then\r\n strFieldType = &quot;INTEGER&quot;\r\nElse\r\n strFieldType = &quot;COUNTER&quot;\r\nEnd If\r\nCase dbText\r\nstrFieldType = &quot;TEXT&quot;\r\nstrFieldType = strFieldType &amp; &quot;(&quot; &amp; fld.Size &amp; &quot;)&quot;\r\nCase dbCurrency\r\nstrFieldType = &quot;MONEY&quot;\r\nCase dbInteger\r\nstrFieldType = &quot;SMALLINT&quot;\r\nCase dbBoolean\r\nstrFieldType = &quot;BIT&quot;\r\nCase dbSingle\r\nstrFieldType = &quot;REAL&quot;\r\nCase dbDate\r\nstrFieldType = &quot;DATETIME&quot;\r\nCase dbLongBinary\r\nstrFieldType = &quot;IMAGE&quot;\r\nCase dbMemo\r\nstrFieldType = &quot;LONGTEXT&quot;\r\nCase dbByte\r\nstrFieldType = &quot;BYTE&quot;\r\nCase dbSingle\r\nstrFieldType = &quot;SINGLE&quot;\r\nCase dbDouble\r\nstrFieldType = &quot;DOUBLE&quot;\r\nCase dbBinary\r\nstrFieldType = &quot;BINARY&quot;\r\nCase dbLongBinary\r\nstrFieldType = &quot;OLE OBJECT&quot;\r\nCase dbGUID\r\nstrFieldType = &quot;GUID&quot;\r\nCase Else\r\nstrFieldType = fld.Type\r\nStop\r\nDebug.Print fld.Type\r\nEnd Select\r\nGetFieldType = strFieldType\r\nEnd Function<\/pre>\n<p><!--30percent--><\/p>\n<p>Mit dem Feldnamen und dem Datentyp stellt unsere <b>For Each<\/b>-Schleife also Ausdr&uuml;cke der Form <\/p>\n<pre>[AnredeID] COUNTER, [Anrede] CHAR(255),<\/pre>\n<p>zusammen. Um das angeh&auml;ngte Komma k&uuml;mmert sich die Prozedur sp&auml;ter.<\/p>\n<p>Der folgende Block enth&auml;lt eine weitere <b>For Each<\/b>-Schleife, welche diesmal alle <b>Index<\/b>-Elemente der aktuellen Tabelle durchl&auml;uft. Das <b>Index<\/b>-Element enth&auml;lt eine Reihe verschiedener Eigenschaften, welche die Art des Indexes festlegen: <b>Foreign<\/b>, <b>IgnoreNulls<\/b>, <b>Primary<\/b>, <b>Required <\/b>und <b>Unique<\/b>. Die Funktion <b>GetCreateTableString <\/b>k&uuml;mmert sich nur um die <b>Foreign<\/b>-Indizes &#8211; alle &uuml;brigen werden in einer separaten Funktion behandelt.<\/p>\n<p>Hat die <b>Foreign<\/b>-Eigenschaft eines <b>Index<\/b>-Elements den Wert <b>True<\/b>, handelt es sich um einen Fremdschl&uuml;sselindex, f&uuml;r den es eine Beziehung zu einer anderen Tabelle gibt. Die Beziehungen einer Datenbank werden &uuml;ber die <b>Relations<\/b>-Auflistung des <b>Database<\/b>-Objekts verf&uuml;gbar gemacht. Wenn die Funktion <b>GetCreateTableString <\/b>eine Tabelle mit einem <b>Foreign<\/b>-Index entdeckt, durchsucht sie die <b>Relations<\/b>-Auflistung nach einem <b>Relation<\/b>-Element, dessen Eigenschaft <b>ForeignTable <\/b>den Namen der aktuellen Tabelle enth&auml;lt und deren Feld mit dem Feld des aktuellen Indexes &uuml;bereinstimmt. Hat sie ein passendes <b>Relation<\/b>-Element gefunden, stellen die folgenden Zeilen zum Beispiel diesen Ausdruck zusammen:<\/p>\n<pre>CONSTRAINT [tblKategorientblArtikel] FOREIGN KEY ([KategorieID]) REFERENCES [tblKategorien] ON UPDATE CASCADE ON DELETE CASCADE,<\/pre>\n<p>Ob der Ausdruck <b>ON UPDATE CASCADE <\/b>(Aktualisierungsweitergabe) oder <b>ON DELETE CASCADE <\/b>(L&ouml;schweitergabe) eingef&uuml;gt wird, h&auml;ngt davon ab, ob der Benutzer die entsprechenden Eigenschaften im Dialog <b>Beziehungen bearbeiten <\/b>eingestellt hat. Dies ist zum Beispiel in Bild 2 der Fall.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Datenbankschema-web-images\/pic001_opt.jpeg\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Beziehungseigenschaften mit L&ouml;sch- und Aktualisierungsweitergabe<\/span><\/b><\/p>\n<p>Aus den Eigenschaften des <b>Relation<\/b>-Objekts bekommt man dies nur &uuml;ber Umwege heraus. Die ben&ouml;tigten Informationen stecken in der Eigenschaft <b>Attributes<\/b>, die &#8211; wie die Pluralform schon andeutet &#8211; die Werte mehrerer Eigenschaften speichern kann. Bei diesen Eigenschaften kann es sich freilich nur um <b>Boolean<\/b>-Eigenschaften auf Bit-Ebene handeln: Ob eine Eigenschaft den Wert <b>True <\/b>oder <b>False <\/b>aufweist, h&auml;ngt n&auml;mlich davon ab, ob ein die Eigenschaft repr&auml;sentierender Zahlenwert im Bit-Wert der Eigenschaft <b>Attributes <\/b>enthalten ist. Haben alle Eigenschaften den Wert <b>False<\/b>, ist <b>Attributes <\/b>gleich <b>0<\/b>. Hat eine der Eigenschaften den Wert <b>True<\/b>, wird ein entsprechender Zahlenwert zum bestehenden Eigenschaftswert von <b>Attributes <\/b>hinzuaddiert. Wie kommt man aber nun an diese Zahlenwerte Hier hilft ein Blick in den Objektkatalog weiter (siehe Bild 3). Wenn Sie hier auf eine der <b>db&#8230;<\/b>-Konstanten klicken, finden Sie im unteren Bereich den entsprechenden Zahlenwert.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Datenbankschema-web-images\/pic002_opt.jpeg\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Der Objektkatalog liefert die m&ouml;glichen Eigenschaftswerte f&uuml;r die Eigenschaft Attributes des Relation-Objekts.<\/span><\/b><\/p>\n<p>Damit man aus mehreren addierten Zahlenwerten ablesen kann, ob der Zahlenwert f&uuml;r eine bestimmte Eigenschaft enthalten ist, m&uuml;ssen die Zahlenwerte Zweierpotenzen sein (also <b>0<\/b>, <b>1<\/b>, <b>2<\/b>, <b>4<\/b>, <b>8 <\/b>und so weiter). In diesem Fall entspricht <b>dbRelationDeleteCascade <\/b>dem Wert <b>4096 <\/b>und <b>dbRelationUpdateCascade <\/b>dem Wert <b>256<\/b>. Unabh&auml;ngig von den &uuml;brigen m&ouml;glichen Eigenschaftswerten enth&auml;lt <b>Attributes <\/b>nun den Wert <b>4096<\/b>, wenn L&ouml;schweitergabe aktiviert ist, den Wert <b>256<\/b>, wenn nur Aktualisierungsweitergabe aktiviert ist, und die Summe aus beiden, also <b>4352<\/b>, wenn der Benutzer beide Optionen im Dialog <b>Beziehungen bearbeiten <\/b>aktiviert hat. Im Code k&ouml;nnen wir mit dem <b>And<\/b>-Operator ganz einfach pr&uuml;fen, ob eine der interessierenden Eigenschaften gesetzt ist. Der folgende Ausdruck liefert beispielsweise <b>True <\/b>zur&uuml;ck, wenn <b>dbRelationDeleteCascade <\/b>gesetzt ist:<\/p>\n<pre>(rel.Attributes And dbRelationUpdateCascade) = dbRelationUpdateCascade<\/pre>\n<p>Wie dies technisch funktioniert, lesen Sie im Beitrag <b>Rund um Bin&auml;rzahlen <\/b>(Shortlink 556). Nach dem Zusammensetzen der Feldliste und der <b>Foreign-Constraints<\/b>-Liste entfernt die Funktion noch das Komma hinter dem letzten Element, schlie&szlig;t die Klammer und gibt den resultierenden Ausdruck als Funktionswert zur&uuml;ck.<\/p>\n<p><b>Datentypen ermitteln<\/b><\/p>\n<p>Kommen wir zur Funktion <b>GetFieldType <\/b>aus Listing 2 zur&uuml;ck. Diese soll einen Ausdruck ermitteln, der auf Basis der <b>Type<\/b>-Eigenschaft des <b>Field<\/b>-Objekts einen SQL-kompatiblen Datentyp zur&uuml;ckliefert. <\/p>\n<p class=\"kastentabelleheader\">Listing 3: Diese Funktion liefert je Index eine eigene CREATE INDEX-Anweisung.<\/p>\n<pre>Public Function GetCreateIndexString(tdf As DAO.TableDef, _\r\n    idx As DAO.Index) As String\r\n    Dim fld As DAO.Field\r\n    Dim strIndex As String\r\n    Dim strFields As String\r\n    Dim strWith As String\r\n    Dim strGUID As String\r\n    strIndex = strIndex &amp; &quot;CREATE &quot;\r\n    If idx.Unique Then\r\n        strIndex = strIndex &amp; &quot;UNIQUE &quot;\r\n    End If\r\n    strIndex = strIndex &amp; &quot;INDEX &quot;\r\n    If idx.Foreign Then\r\n        strGUID = CreateGUID\r\n    End If\r\n    strIndex = strIndex &amp; &quot;[&quot; &amp; strGUID &amp; idx.Name &amp; &quot;]&quot;\r\n    strIndex = strIndex &amp; &quot; ON &quot;\r\n    strIndex = strIndex &amp; &quot;[&quot; &amp; tdf.Name &amp; &quot;]&quot;\r\n    strFields = &quot;&quot;\r\n    For Each fld In idx.Fields\r\n        strFields = strFields &amp; &quot;[&quot; &amp; fld.Name &amp; &quot;], &quot;\r\n    Next fld\r\n    strFields = Left(strFields, Len(strFields) - 2)\r\n    strIndex = strIndex &amp; &quot;(&quot;\r\n    strIndex = strIndex &amp; strFields\r\n    strIndex = strIndex &amp; &quot;)&quot;\r\n    strWith = &quot;&quot;\r\n    If idx.Primary Then\r\n        strWith = strWith &amp; &quot;PRIMARY &quot;\r\n    End If\r\n    If idx.Required Then\r\n        strWith = strWith &amp; &quot;DISALLOW NULL &quot;\r\n    End If\r\n    If idx.IgnoreNulls Then\r\n        strWith = strWith &amp; &quot;IGNORE NULL &quot;\r\n    End If\r\n    If Len(strWith) &gt; 0 Then\r\n        strIndex = strIndex &amp; &quot; WITH &quot; &amp; Trim(strWith)\r\n    End If\r\n    strIndex = strIndex &amp; &quot;;&quot;\r\n    GetCreateIndexString = strIndex\r\nEnd Function<\/pre>\n<p>Die <b>Type<\/b>-Eigenschaft liefert uns aber erstmal nur Zahlenwerte. Wie sollen wir von denen auf den ben&ouml;tigten SQL-Datentyp schlie&szlig;en Hier hilft wiederum der Objektkatalog weiter: Er liefert mit der Enumeration <b>DataTypeEnum <\/b>eine Liste aller m&ouml;glichen <b>DAO<\/b>-Datentypen (siehe Bild 4). Diese m&uuml;ssen wir nun noch mit den unter SQL verwendeten Datentypen abgleichen, wobei die VBA-Online-Hilfe hilfreich ist &#8211; unter Access 2007 kommt man hier etwa mit den Schl&uuml;sselw&ouml;rtern <b>SQL <\/b>und <b>Datentypen <\/b>zu einer &Uuml;bersicht der SQL-Datentypen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Datenbankschema-web-images\/pic003_opt.jpeg\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Auch f&uuml;r die Datentypen liefert der Objektkatalog die entsprechenden Konstanten.<\/span><\/b><\/p>\n<p>Das Ergebnis dieser Recherche finden Sie in angereicherter Form eben in der Funktion <b>GetFieldType<\/b>. Diese liefert im einfachen Fall einfach das zum <b>Type<\/b>-Wert passende SQL-Schl&uuml;sselwort zur&uuml;ck. In manchen F&auml;llen brauchen wir weitere Informationen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Beim <b>Long<\/b>-Datentyp handelt es sich oft um Autowerte. Wenn die <b>Attributes<\/b>-Eigenschaft des <b>Field<\/b>-Objekts das Attribut <b>dbAutoIncrField <\/b>enth&auml;lt, ist dies der Fall. Dann soll die Funktion als Datentyp <b>COUNTER <\/b>statt <b>INTEGER <\/b>zur&uuml;ckliefern.<\/li>\n<li class=\"aufz-hlung\">F&uuml;r Textfelder wird der Datentyp <b>TEXT <\/b>mit der Angabe der Feldgr&ouml;&szlig;e in Klammern zur&uuml;ckgeliefert. Die Feldgr&ouml;&szlig;e liefert die <b>Size<\/b>-Eigenschaft des <b>Field<\/b>-Objekts.<\/li>\n<\/ul>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Indizes definieren<\/p>\n<p>Nachdem die Funktion <b>GetCreateTableString <\/b>den eigentlichen Tabellenaufbau inklusive Beziehungen liefert, ist die Funktion <b>GetCreateIndexString <\/b>(s. Listing 3) f&uuml;r die &uuml;brigen Indizes verantwortlich. Die Funktion wird f&uuml;r jedes <b>Index<\/b>-Element der <b>Indexes<\/b>-Auflistung eines <b>TableDef<\/b>-Objekts einmal aufgerufen und erwartet das zu untersuchende <b>TableDef<\/b>&#8211; und <b>Index<\/b>-Element als Parameter.<\/p>\n<p>Auch diese Funktion beginnt das Zusammensetzen des gefragten Ausdrucks mit dem <b>CREATE<\/b>-Schl&uuml;sselwort. Dann f&uuml;gt sie, wenn es sich bei dem Index um einen eindeutigen Index handelt, das <b>UNIQUE<\/b>-Schl&uuml;sselwort an &#8211; in jedem Falle gefolgt von <b>INDEX<\/b>.<\/p>\n<p>F&uuml;r den Namen des <b>Index<\/b>-Elements ergibt sich eine Besonderheit: Offensichtlich bietet SQL nicht die M&ouml;glichkeit, einen Prim&auml;rschl&uuml;ssel- oder eindeutigen Index gleichzeitig als Fremdschl&uuml;ssel einzurichten (dies geschieht nicht besonders oft, kann aber vorkommen, wenn man 1:1-Beziehungen einrichtet). Interessanterweise besitzt Access aber intern wohl die M&ouml;glichkeit, unter dem gleichen Namen Indizes mit Prim&auml;r- und Fremdschl&uuml;sseleigenschaften gleichzeitig einzurichten. Die vorliegende L&ouml;sung erzeugt daraus zun&auml;chst einen <b>FOREIGN KEY<\/b>-Constraint und anschlie&szlig;end in der Funktion <b>GetCreateIndexString <\/b>einen gegebenenfalls als <b>UNIQUE <\/b>gekennzeichneten <b>PRIMARY<\/b>-Constraint. Dieser sollte eigentlich den gleichen Namen wie der <b>FOREIGN KEY<\/b>-Index haben. Das Anlegen von Indizes mit bereits vergebenen Namen l&ouml;st allerdings einen Fehler aus, sodass wir dem Namen des betroffenen Indexes eine GUID zur Alleinstellung voranstellen.<\/p>\n<p>Weiter im Code: Das Schl&uuml;sselwort <b>ON <\/b>und der Name der Tabelle erg&auml;nzen die <b>CREATE INDEX<\/b>-Anweisung. Anschlie&szlig;end folgt in Klammern die Feldliste. Schlie&szlig;lich liest die Funktion anhand der Eigenschaften <b>Primary<\/b>, <b>Required <\/b>und <b>IgnoreNulls <\/b>die Eigenschaften des Indexes aus und f&uuml;gt entsprechende SQL-Schl&uuml;sselw&ouml;rter an den Ausdruck an. Diese entsprechen genau den drei Eigenschaften, die Sie im <b>Indizes<\/b>-Dialog beim Entwurf einer Tabelle angeben k&ouml;nnen (siehe Bild 5).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_01\/Datenbankschema-web-images\/pic004_opt.jpeg\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Eigenschaften eines Indexes im Tabellenentwurf<\/span><\/b><\/p>\n<p><b>Einfacher Aufruf<\/b><\/p>\n<p>Die Funktion <b>CreateTableString <\/b>rundet die bislang vorgestellten Funktionen ab (s. Listing 4). Sie erwartet lediglich den Namen der Tabelle, die Sie per SQL-Anweisung reproduzieren m&ouml;chten, und gibt die ben&ouml;tigten SQL-Ausdr&uuml;cke zur&uuml;ck. Dazu ruft sie die bisher vorgestellten Funktionen mit den entsprechenden Parametern auf. Das Formular <b>frmDDL<\/b>, das wir ganz zu Beginn in Bild 1 vorgestellt haben, macht sich diese Funktion zunutze, indem sie diese nach der Auswahl einer der Tabellen im Kombinationsfeld aufruft und den resultierenden Ausdruck anzeigt. Wenn Sie die L&ouml;sung in eigenen Datenbanken einsetzen m&ouml;chten, brauchen Sie lediglich das Formular <b>frmDDL<\/b> und die Module <b>mdlSQLDump <\/b>und <b>mdlGUIDs <\/b>in die Datenbank zu importieren und das Formular zu starten.<\/p>\n<p class=\"kastentabelleheader\">Listing 4: Diese Funktion erwartet lediglich die Angabe des Tabellennamens und liefert die zum Erstellen dieser Tabelle n&ouml;tigen SQL-Anweisungen zur&uuml;ck.<\/p>\n<pre>Public Function CreateTableString(strTable As String) As String\r\nDim db As DAO.Database\r\nDim idx As DAO.Index\r\nDim tdf As DAO.TableDef\r\nDim strSQL As String\r\nDim strIndex As String\r\nSet db = CurrentDb\r\nSet tdf = db.TableDefs(strTable)\r\nstrSQL = GetCreateTableString(tdf)\r\nFor Each idx In tdf.Indexes\r\n strIndex = strIndex &amp; GetCreateIndexString(tdf, idx) &amp; vbCrLf\r\nNext idx\r\nCreateTableString = strSQL &amp; vbCrLf &amp; strIndex\r\nEnd Function<\/pre>\n<p><b>Vorgehensweise beim Ausf&uuml;hren der SQL-Anweisungen<\/b><\/p>\n<p>Ausf&uuml;hren k&ouml;nnen Sie die Anweisungen mit einem Klick auf die Schaltfl&auml;che <b>cmdAusfuehren<\/b>. Dies l&ouml;st die folgende kleine Routine aus:<\/p>\n<pre>Public Sub SQLAusfuehren(strSQL As String)\r\nDim cnn As ADODB.Connection\r\nDim strSQLLines() As String\r\nDim i As Integer\r\nSet cnn = CurrentProject.Connection\r\nstrSQLLines = Split(strSQL, vbCrLf)\r\nFor i = LBound(strSQLLines) To _\r\n UBound(strSQLLines)\r\n    cnn.Execute strSQLLines(i)\r\nNext i\r\nEnd Sub<\/pre>\n<p>Die Routine teilt die aus mehreren durch Zeilenumbr&uuml;che getrennten Anweisungen auf und schreibt diese in ein Array, dessen Elemente dann mit der <b>Execute<\/b>-Methode eines ADODB-Connection-Objekts ausgef&uuml;hrt werden. Der Vorteil gegen&uuml;ber der gleichnamigen Methode des DAO-Database-Objekts ist, dass Sie per ADODB mehr M&ouml;glichkeiten haben &#8211; die L&ouml;sch- und Aktualisierungsweitergabe etwa l&auml;sst sich mit DAO nicht anwenden. Die <b>RefreshDatabaseWindow<\/b>-Methode des <b>Application<\/b>-Objekts aktualisiert schlie&szlig;lich die Anzeige im Datenbankfenster. Beachten Sie beim Anlegen von Datenmodellen mit verkn&uuml;pften Tabellen, dass vor dem Anlegen von Tabellen mit Fremdschl&uuml;sselfeldern die Tabellen mit dem entsprechenden Prim&auml;rschl&uuml;sselfeld vorhanden sein m&uuml;ssen. Wenn Sie gleich mehrere Tabellen auf einen Rutsch erstellen m&ouml;chten, f&uuml;gen Sie die mit dieser L&ouml;sung erzeugten SQL-Anweisungen in der richtigen Reihenfolge aneinander. Achten Sie darauf, dass einzelne Anweisungen durch einen Zeilenumbruch (<b>vbcrlf<\/b>) voneinander getrennt sein m&uuml;ssen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SQLDump.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{866A7D2E-4CB9-48D1-84E7-9FBCD20362B8}\/aiu_698.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unter dem SQL-Datenbankschema verstehen wir eine Reihe von SQL-Anweisungen, mit denen Sie Tabellen oder auch eine komplette Datenbank erstellen k&ouml;nnen. Dazu geh&ouml;ren beispielsweise die CREATE TABLE- oder CREATE INDEX-Anweisungen. Da man diese Befehle eher selten einsetzt, kann eine L&ouml;sung zum automatischen Erstellen des Schemas einer oder mehrerer Tabellen nicht schaden. Der vorliegende Beitrag zeigt, wie es funktioniert.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012010,662010,44000021],"tags":[],"class_list":["post-55000698","post","type-post","status-publish","format-standard","hentry","category-66012010","category-662010","category-Tabellen_und_Datenmodellierung"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>SQL-Datenbankschema auslesen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL-Datenbankschema auslesen\" \/>\n<meta property=\"og:description\" content=\"Unter dem SQL-Datenbankschema verstehen wir eine Reihe von SQL-Anweisungen, mit denen Sie Tabellen oder auch eine komplette Datenbank erstellen k&ouml;nnen. Dazu geh&ouml;ren beispielsweise die CREATE TABLE- oder CREATE INDEX-Anweisungen. Da man diese Befehle eher selten einsetzt, kann eine L&ouml;sung zum automatischen Erstellen des Schemas einer oder mehrerer Tabellen nicht schaden. Der vorliegende Beitrag zeigt, wie es funktioniert.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:10:09+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/2db6f33a5df94be59d6a7b0529bec030\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"SQL-Datenbankschema auslesen\",\"datePublished\":\"2020-05-22T22:10:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/\"},\"wordCount\":2515,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2db6f33a5df94be59d6a7b0529bec030\",\"articleSection\":[\"1\\\/2010\",\"2010\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/\",\"name\":\"SQL-Datenbankschema auslesen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2db6f33a5df94be59d6a7b0529bec030\",\"datePublished\":\"2020-05-22T22:10:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2db6f33a5df94be59d6a7b0529bec030\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2db6f33a5df94be59d6a7b0529bec030\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQLDatenbankschema_auslesen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL-Datenbankschema auslesen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SQL-Datenbankschema auslesen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/","og_locale":"de_DE","og_type":"article","og_title":"SQL-Datenbankschema auslesen","og_description":"Unter dem SQL-Datenbankschema verstehen wir eine Reihe von SQL-Anweisungen, mit denen Sie Tabellen oder auch eine komplette Datenbank erstellen k&ouml;nnen. Dazu geh&ouml;ren beispielsweise die CREATE TABLE- oder CREATE INDEX-Anweisungen. Da man diese Befehle eher selten einsetzt, kann eine L&ouml;sung zum automatischen Erstellen des Schemas einer oder mehrerer Tabellen nicht schaden. Der vorliegende Beitrag zeigt, wie es funktioniert.","og_url":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:10:09+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/2db6f33a5df94be59d6a7b0529bec030","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"SQL-Datenbankschema auslesen","datePublished":"2020-05-22T22:10:09+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/"},"wordCount":2515,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2db6f33a5df94be59d6a7b0529bec030","articleSection":["1\/2010","2010","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/","url":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/","name":"SQL-Datenbankschema auslesen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2db6f33a5df94be59d6a7b0529bec030","datePublished":"2020-05-22T22:10:09+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/2db6f33a5df94be59d6a7b0529bec030","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/2db6f33a5df94be59d6a7b0529bec030"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/SQLDatenbankschema_auslesen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"SQL-Datenbankschema auslesen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000698","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000698"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000698\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}