{"id":55000488,"date":"2025-10-01T00:00:00","date_gmt":"2025-12-28T12:30:27","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=488"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Dateien_im_SQL_Server_speichern_mit_FileTables","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Dateien_im_SQL_Server_speichern_mit_FileTables\/","title":{"rendered":"Dateien im SQL Server speichern mit FileTables"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/fcb5d35208e14446aa74c2ae11cae29b\" width=\"1\" height=\"1\" alt=\"\"><b>In Access gibt es verschiedene M&ouml;glichkeiten, Dateien zu speichern. Diese kann man zum Beispiel in Anlagefeldern ablegen, oder man bel&auml;sst die eigentlichen Dateien im Dateisystem und notiert in den Tabellen lediglich den Pfad zu den Dateien oder auch nur die Dateinamen. Welche Variante man w&auml;hlt, h&auml;ngt letztlich von der Menge und der Gr&ouml;&szlig;e der Dateien ab, sprich: vom ben&ouml;tigten Speicherplatz. Der ist n&auml;mlich in Access-Datenbanken auf zwei Gigabytes begrenzt. In SQL Server-Datenbanken sieht dies ganz anders aus. Selbst bei Verwendung der kostenlosen Express-Edition d&uuml;rfen die einzelnen Datenbank-Dateien bis zu zehn Gigabytes an Platz auf der Festplatte einnehmen. Auch hier gibt es verschiedene Varianten zum Speichern der Dateien. Die erste ist, die Dateien in varbinary(max)-Feldern zu hinterlegen. Oder man nutzt dazu sogenannte Filetables. Hier werden die Dateien in einem speziell dazu vorgesehenen Bereich der Festplatte abgelegt, aber unter die Kontrolle des SQL Servers gestellt &#8211; und gleichzeitig &uuml;ber einen speziellen Typ von Tabelle verwaltet. Wie das gelingt, zeigen wir in diesem Artikel.<\/b><\/p>\n<h2>Dateien in Access und der Speicherplatz<\/h2>\n<p>Eines der gro&szlig;en Probleme von Access-Datenbanken ist der vergleichsweise geringe Speicherplatz. Sicher, wenn wir nur reine Textinformationen oder Zahlen verwalten, kommen wir damit eine Weile aus.<\/p>\n<p>Soll die Datenbank aber auch in Feldern etwa des Typs <b>OLE-Objekt <\/b>oder <b>Anlage<\/b> noch Elemente wie Bilder oder Dateien aufnehmen, geraten wir schnell ans Limit.<\/p>\n<p>Unter Access gibt es dabei die M&ouml;glichkeit, nur den Pfad zur jeweiligen Datei zu speichern und diese im Dateisystem zu belassen, aber damit sind einige Einschr&auml;nkungen verbunden &#8211; zum Beispiel m&uuml;ssen wir die Pfadangaben &auml;ndern, wenn die Datenbank samt referenzierter Dateien einmal verschoben werden soll und wir m&uuml;ssen uns selbst darum k&uuml;mmern, dass die Daten immer an Ort und Stelle bleiben und gesichert werden.<\/p>\n<h2>Alternativen im SQL Server<\/h2>\n<p>Die M&ouml;glichkeiten in einer SQL Server-Datenbank sehen &auml;hnlich aus. Das Pendant zum Anlagefeld oder dem OLE-Objekt-Feld sind Felder mit dem Datentyp <b>varbinary(max)<\/b>.<\/p>\n<p>Dies &auml;hnelt allerdings eher dem Datentyp <b>OLE-Object<\/b> in Access &#8211; die Dateien werden dort im Bin&auml;rformat gespeichert, was bedeutet, dass wir diese, wenn wir beispielsweise Bilddateien in einem Bildsteuerelement anzeigen wollen, zuvor erst in das geeignete Format umwandeln m&uuml;ssen.<\/p>\n<p>Praktischer f&uuml;r diesen Fall ist unter Access das Anlagefeld. Darin gespeicherte Bilder lassen sich durch Angabe des jeweiligen Feldes als Steuerelementinhalt direkt im Bildsteuerelement anzeigen.<\/p>\n<h2>FileTable: Kombination aus Dateisystem und Tabelle<\/h2>\n<p>Daher ist die Verwendung eines sogenannten FileTables unter SQL Server eine geeignete Alternative. Zwar l&auml;sst sich ein Bildsteuerelement nicht direkt an ein Feld dieser FileTable binden, aber in der FileTable werden die Pfadangaben zur jeweiligen Datei gespeichert, den wir ebenfalls als Datenquelle von Bildsteuerelementen angeben k&ouml;nnen.<\/p>\n<p>Gleichzeitig k&ouml;nnen wir, entsprechende Berechtigungen vorausgesetzt, in einer FileTable gespeicherte Dateien in einem Bildsteuerelement von Access anzeigen.<\/p>\n<p>Daher schauen wir uns in diesem Artikel einmal genau an, wie wir eine FileTable im SQL Server erstellen und nutzen k&ouml;nnen.<\/p>\n<p>In weiteren Artikeln betrachten wir, wie die in einer <b>FileTable<\/b>-Tabelle gespeicherte Bilddateien in einem Access-Bildsteuerelement angezeigt werden k&ouml;nnen.<\/p>\n<h2>Voraussetzungen f&uuml;r den Einsatz von FileTables<\/h2>\n<p>Die erste und wichtigste Voraussetzung ist die Aktivierung eines speziellen Features des SQL Servers, n&auml;mlich <b>FILESTREAM<\/b>.<\/p>\n<p>Dieses Feature wurde mit SQL Server 2008 eingef&uuml;hrt, <b>FileTable <\/b>gibt es seit 2012. Wenn Du also nicht mit einer vorsintflutlichen Version von SQL Server arbeitest, sollten die Voraussetzungen grunds&auml;tzlich erf&uuml;llt sein.<\/p>\n<p><b>FILESTREAM <\/b>ist standardm&auml;&szlig;ig nicht aktiviert, wir m&uuml;ssen diese Funktion also erst einmal an den Start bringen.<\/p>\n<h2>FILESTREAM aktivieren<\/h2>\n<p>Wir beschreiben das Aktivieren von <b>FILESTREAM <\/b>in den folgenden Abschnitten f&uuml;r eine frisch installierte Instanz der SQL Server Express Edition.<\/p>\n<p>Dazu starten wir den SQL Server-Konfigurations-Manager, was zum Beispiel f&uuml;r SQL Server 2022 wie folgt gelingt:<\/p>\n<ul>\n<li>Ausf&uuml;hren-Fenster mit <b>Windows + R<\/b> starten<\/li>\n<li>Dort geben wir wie in Bild 1 <b>SQLServerManager16.msc <\/b>ein (Versionsnummer entsprechend Deiner Version anpassen).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_001.png\" alt=\"Aufrufen des SQL Server-Konfigurationsmanagers\" width=\"424,6267\" height=\"219,2308\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Aufrufen des SQL Server-Konfigurationsmanagers<\/span><\/b><\/p>\n<\/ul>\n<p>Danach klicken wir doppelt auf den Eintrag SQL Server-Dienste und dann mit der rechten Maustaste rechts auf die gew&uuml;nschte Instanz, hier <b>SQL Server (SQLEXPRESS) <\/b>und w&auml;hlen den Eintrag <b>Eigenschaften <\/b>aus  &#8211; wobei der in Klammern angegebene Name der Instanzname ist und auch abweichen kann (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_002.png\" alt=\"Anzeigen der Eigenschaften der SQL Server-Instanz\" width=\"649,627\" height=\"338,4475\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anzeigen der Eigenschaften der SQL Server-Instanz<\/span><\/b><\/p>\n<p>Im nun erscheinenden Dialog wechseln wir zur Registerseite <b>FILESTREAM<\/b> (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_003.png\" alt=\"Eigenschaften mit dem FILESTREAM-Bereich\" width=\"424,6267\" height=\"441,0374\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Eigenschaften mit dem FILESTREAM-Bereich<\/span><\/b><\/p>\n<p>Dort finden wir folgende Optionen:<\/p>\n<ul>\n<li><b>FILESTREAM f&uuml;r Transact-SQL-Zugriff aktivieren<\/b>: Aktiviert den <b>FILESTREAM <\/b>auf SQL Server-Basis.<\/li>\n<li><b>FILESTREAM f&uuml;r E\/A-Datenzugriff aktivieren<\/b>: Aktiviert <b>FILESTREAM <\/b>f&uuml;r den Zugriff &uuml;ber das Dateisystem.<\/li>\n<li><b>Windows-Freigabename<\/b>: Gibt den Namen des Verzeichnisses an, in dem die Dateien gespeichert werden.<\/li>\n<li><b>Zugriff von Remoteclients auf FILESTREAM-Daten zulassen<\/b>: Erlaubt den Zugriff von anderen Rechnern im Netzwerk.<\/li>\n<\/ul>\n<p>Hier aktivieren wir die ersten beiden Optionen und belassen den Windows-Freigabenamen bei <b>SQLEXPRESS<\/b>.<\/p>\n<p>Danach muss der SQL Server neu gestartet werden, was wir wiederum im SQL Server Konfigurationsmanager erledigen, indem wir dort den Kontextmen&uuml; <b>Neu starten <\/b>aufrufen (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_004.png\" alt=\"Neustart des SQL Servers\" width=\"649,627\" height=\"383,2183\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Neustart des SQL Servers<\/span><\/b><\/p>\n<p>Alternativ starten wir den SQL Server direkt im SQL Server Management Studio neu, indem wir mit der rechten Maustaste auf den Eintrag f&uuml;r den Server klicken und den Befehl <b>Neu starten <\/b>bet&auml;tigen.<\/p>\n<p>Die hier vorgenommenen Einstellungen k&ouml;nnen wir auch &uuml;ber das SQL Server Management Studio vornehmen. Dazu zeigen wir die Eigenschaften des Eintrags f&uuml;r den SQL Server an und wechseln dort zur Seite <b>Erweitert <\/b>(siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_017.png\" alt=\"FILESTREAM in den SQL Server-Eigenschaften im SQL Server Management Studio\" width=\"649,627\" height=\"605,5845\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: FILESTREAM in den SQL Server-Eigenschaften im SQL Server Management Studio<\/span><\/b><\/p>\n<p>Wenn wir <b>FILESTREAM <\/b>f&uuml;r den Zugriff &uuml;ber das Dateisystem aktiviert haben, finden wir im Windows Explorer eine entsprechende Freigabe vor (siehe Bild 6). Wenn diese nicht direkt sichtbar ist, geben wir in der Adressleiste des Windows Explorers folgendes ein:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_005.png\" alt=\"Freigabe f&uuml;r SQLEXPRESS\" width=\"649,627\" height=\"326,0643\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Freigabe f&uuml;r SQLEXPRESS<\/span><\/b><\/p>\n<pre><\/font>Rechnername<\/pre>\n<p>Dann erscheinen zun&auml;chst die SQL Server-Instanzen. Hier klicken wir im Falle der Express-Edition doppelt auf <b>SQLEXPRESS<\/b>.<\/p>\n<p>Auf diese k&ouml;nnen wir aber aktuell noch nicht zugreifen.<\/p>\n<p>Dazu m&uuml;ssen wir im SQL Server Management Studio noch den vollen Zugriff aktivieren (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_006.png\" alt=\"Erweitern auf Vollzugriff\" width=\"649,627\" height=\"452,3531\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Erweitern auf Vollzugriff<\/span><\/b><\/p>\n<p>Danach k&ouml;nnen wir schlie&szlig;lich auf die Freigabe <b>amvDesktop2023\\SQLEXPRESS<\/b> (oder wie sie bei Dir hei&szlig;t) zugreifen, finden dort aber bisher weder Ordner noch Dateien vor.<\/p>\n<p>Wozu diese Freigabe ben&ouml;tigt wird, erl&auml;utern wir in den folgenden Abschnitten.<\/p>\n<p>Die <b>FileTable<\/b>-Technik basiert auf <b>FILESTREAM<\/b>. Damit k&ouml;nnen wir sowohl Dateien &uuml;ber die Datenbank speichern und diese dann &uuml;ber das Dateisystem &ouml;ffnen als auch Dateien in dem f&uuml;r die Datenbank vorgesehenen Verzeichnis speichern und diese damit unter den Zugriff der SQL Server-Datenbank stellen.<\/p>\n<h2>FILESTREAM-Beispieldatenbank erstellen<\/h2>\n<p>Zu Beispielzwecken erstellen wir zun&auml;chst eine neue Datenbank, die mit <b>FILESTREAM <\/b>ausgestattet ist. Das erledigen wir im SQL Server Management Studio, indem wir in einer neuen Abfrage den Code aus Listing 1 ausf&uuml;hren.<\/p>\n<pre>CREATE DATABASE FileTableDB\r\nON \r\nPRIMARY (NAME=FileTableDB, \r\nFILENAME=''C:\\Program Files\\Microsoft SQL Server\\MSSQL17.SQLEXPRESS\\MSSQL\\DATA\\FileTableDB.mdf''),\r\nFILEGROUP FileTableDB_GROUP CONTAINS FILESTREAM(NAME=FileTable_DB, \r\nFILENAME=''C:\\Program Files\\Microsoft SQL Server\\MSSQL17.SQLEXPRESS\\MSSQL\\DATA\\FileTableDB'')\r\nLOG ON (NAME=FileTableDB_LOG, \r\nFILENAME=''C:\\Program Files\\Microsoft SQL Server\\MSSQL17.SQLEXPRESS\\MSSQL\\DATA\\FileTableDB.ldf'')<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Erstellen einer Datenbank mit FILESTREAM<\/span><\/b><\/p>\n<p>Danach erscheint die neue Datenbank wie in Bild 8 im SQL Server Management Studio.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_018.png\" alt=\"Die neue FileTable-Datenbank\" width=\"424,6267\" height=\"324,4539\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Die neue FileTable-Datenbank<\/span><\/b><\/p>\n<h2>FILESTREAM-Verzeichnis festlegen<\/h2>\n<p>Weiter oben haben wir bei der Anpassung des SQL Servers f&uuml;r die Verwendung von <b>FILESTREAM<\/b> und <b>FileTable <\/b>bereits einen Windows-Freigabenamen festgelegt, unter dem die vom SQL Server verwalteten Dateien aufzufinden sein sollen.<\/p>\n<p>Diese Freigabe wird von der kompletten SQL Server-Instanz genutzt, was bedeutet, dass nicht nur eine, sondern auch mehrere Datenbanken darauf zugreifen. Deshalb m&uuml;ssen wir pro Datenbank noch ein Unterverzeichnis erstellen. Dieses legen wir in den Eigenschaften der Datenbank auf der Seite Optionen unter <b>FILESTREAM<\/b> fest.<\/p>\n<p>Stelle also f&uuml;r die Eigenschaft <b>FILESTREAM<\/b>-Verzeichnisname einen entsprechenden Wert wie etwa <b>FileTableDB <\/b>ein und lege mit der Eigenschaft <b>Nicht transaktionsgebundener FILESTREAM-Zugriff <\/b>fest, wie weit der Zugriff von au&szlig;erhalb des SQL Servers zugelassen werden soll &#8211; also beispielsweise &uuml;ber den Windows Explorer (siehe Bild 9). Das Verzeichnis k&ouml;nnen wir auch mit folgender Anweisung festlegen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_007.png\" alt=\"Anlegen eines Verzeichnisses f&uuml;r die FileStream-Datenbank\" width=\"599,6265\" height=\"357,0811\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Anlegen eines Verzeichnisses f&uuml;r die FileStream-Datenbank<\/span><\/b><\/p>\n<pre>ALTER DATABASE FileTableDB SET FILESTREAM(DIRECTORY_NAME=''FileTableDB'');<\/pre>\n<p>Und diese Anweisung stellt die Zugriffsart auf <b>FULL<\/b>, <b>READONLY <\/b>oder <b>OFF <\/b>ein:<\/p>\n<pre>ALTER DATABASE FileTable SET FILESTREAM(NON_TRANSACTED_ACCESS=FULL);<\/pre>\n<p>Wenn wir nun noch einmal den Windows Explorer bem&uuml;hen, werden wir unter der bereits vorhandenen Freigabe einen neuen Ordner vorfinden, der den angegebenen Namen tr&auml;gt (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_008.png\" alt=\"Das Verzeichnis f&uuml;r die FileTable-Datenbank\" width=\"599,6265\" height=\"313,8608\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Das Verzeichnis f&uuml;r die FileTable-Datenbank<\/span><\/b><\/p>\n<p>Zum aktuellen Zeitpunkt k&ouml;nnen wir allerdings noch keine Dateien &uuml;ber das Dateisystem in diesem Verzeichnis ablegen. Um dies zu &auml;ndern, m&uuml;ssen wir eine Tabelle zum Speichern der Dateien erstellen. F&uuml;r FileTables sieht der SQL Server einen eigenen Bereich im Objekt-Explorer vor, und zwar unterhalb des Eintrags <b>Tabellen<\/b>.<\/p>\n<p>F&uuml;r den Eintrag <b>FileTables <\/b>finden wir im Kontextmen&uuml; auch die M&ouml;glichkeit, eine neue FileTable zu erstellen (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_009.png\" alt=\"Erstellen einer neuen FileTable\" width=\"424,6267\" height=\"383,8797\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Erstellen einer neuen FileTable<\/span><\/b><\/p>\n<p>Dies zeigt nun ein neues Abfragefenster mit einem Template zum Erstellen einer FileTable an (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_010.png\" alt=\"Code zum Erstellen einer neuen FileTable\" width=\"649,627\" height=\"250,9102\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Code zum Erstellen einer neuen FileTable<\/span><\/b><\/p>\n<p><b>FileTable <\/b>ist prinzipiell ein eigener Tabellentyp, deren Struktur bestimmten Vorgaben unterliegt. Eine einfache Anweisung zum Erstellen einer FileTable ist die folgende:<\/p>\n<pre>CREATE TABLE dbo.tblFileTable AS FILETABLE  WITH  (    FILETABLE_DIRECTORY = ''tblFileTable'', \r\n     FILETABLE_COLLATE_FILENAME = database_default  )<\/pre>\n<p>Dabei geben wir keine Spaltennamen an, sondern nur ein paar Eigenschaften. Die erste hier abgebildete hei&szlig;t <b>FILETABLE_DIRECTORY <\/b>und gibt an, in welchem Verzeichnis unterhalb des Verzeichnisses f&uuml;r die aktuelle Datenbank die Dateien dieser Tabelle gespeichert werden sollen.<\/p>\n<p>Die zweite hei&szlig;t <b>FILETABLE_COLLATE_FILENAME <\/b>und legt die Sortierreihenfolge f&uuml;r die Tabelle fest.<\/p>\n<p>Nach dem Anlegen erscheint die Tabelle in dem f&uuml;r <b>FileTables <\/b>vorgesehenen Bereich im Objekt-Explorer.<\/p>\n<p>Wie wir dem Kontextmen&uuml; f&uuml;r diesen Eintrag entnehmen k&ouml;nnen, sehen die m&ouml;glichen Aktionen etwas anders aus als f&uuml;r herk&ouml;mmliche Tabellen &#8211; zum Beispiel fehlt die M&ouml;glichkeit zum Editieren der Tabelle.<\/p>\n<p>Dies hat seinen Grund: Die Tabelle hat immer das gleiche Schema und wir k&ouml;nnen keine Spalten entfernen, umbenennen oder hinzuf&uuml;gen.<\/p>\n<p>Interessant ist hingegen der Eintrag <b>FileTable-Verzeichnis durchsuchen<\/b>: Dieser Befehl &ouml;ffnet den Windows Explorer mit dem Verzeichnis, das die Dateien dieser <b>FileTable<\/b> aufnimmt (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_011.png\" alt=\"Kontextmen&uuml; einer FileTable-Tabelle\" width=\"424,6267\" height=\"520,6525\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Kontextmen&uuml; einer FileTable-Tabelle<\/span><\/b><\/p>\n<h2>Verzeichnisstruktur<\/h2>\n<p>Noch ein Hinweis zur Verzeichnisstruktur: Diese beginnt immer mit der Freigabe f&uuml;r die Instanz des SQL Servers, die wir in den Freigaben f&uuml;r den Rechner mit der entsprechenden Instanz finden (in diesem Fall <b>amvDesktop2023<\/b>).<\/p>\n<p>Die n&auml;chste Ebene tr&auml;gt den auf Ebene der SQL Server-Instanz angegebenen Namen, hier also etwa <b>SQLEXPRESS<\/b>. Die zweite Verzeichnisebene erh&auml;lt den Namen des Verzeichnisses, das f&uuml;r die aktuelle Datenbank f&uuml;r die Eigenschaft <b>FILESTREAM<\/b>-Verzeichnisname festgelegt wurde (im Beispiel <b>FileTableDB<\/b>).<\/p>\n<p>Wenn wir dies f&uuml;r mehrere Datenbanken der SQL Server-Instanz erledigt haben, finden wir dort f&uuml;r jede Datenbank ein Verzeichnis.<\/p>\n<p>Die dritte Verzeichnisebene wird mit dem Namen der Tabelle zum Speichern der Dateien versehen (im Beispiel <b>tblFileTable<\/b>).<\/p>\n<p>Genau wie f&uuml;r die Datenbanken wird auch f&uuml;r jede <b>FileTable<\/b>-Tabelle ein eigenes Verzeichnis erstellt (siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_012.png\" alt=\"Verzeichnisstruktur inklusive Tabelle\" width=\"499,6267\" height=\"261,5182\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Verzeichnisstruktur inklusive Tabelle<\/span><\/b><\/p>\n<p>Darunter k&ouml;nnen wir weitere Verzeichnisse anlegen, allerdings ist die Verzeichnistiefe begrenzt &#8211; nach 15 Ebenen ist Schluss.<\/p>\n<p>Das Verzeichnis bis zum Ordner f&uuml;r die Tabellen hei&szlig;t also beispielsweise so:<\/p>\n<pre><\/font>Amvdesktop2023\\SQLExpress\\FileTableDB\\tblFileTable<\/pre>\n<h2>FileTable-Verzeichnis ermitteln<\/h2>\n<p>Wenn wir einmal nicht wissen, wo sich das <b>FileTable<\/b>-Verzeichnis befindet, k&ouml;nnen wir zum Beispiel folgende Anweisung im SQL Server Management Studio nutzen, um den Basisordner f&uuml;r alle <b>FileTable<\/b>-Verzeichnisse zu ermitteln:<\/p>\n<pre>SELECT FileTableRootPath()<\/pre>\n<p>Alternativ klicken wir mit der rechten Maustaste auf die <b>FileTable<\/b>-Tabelle im Objekt-Explorer des SQL Server Management Studios und w&auml;hlen den Kontextmen&uuml;-Befehl <b>FileTable-Verzeichnis durchsuchen <\/b>aus.<\/p>\n<h2>Dateien zur FileTable hinzuf&uuml;gen<\/h2>\n<p>Nun wollen wir schauen, wie sich eine <b>FileTable <\/b>in der Praxis anf&uuml;hlt.<\/p>\n<p>Also wechseln wir durch einen Klick auf den Kontextmen&uuml;eintrag <b>FileTable-Verzeichnis durchsuchen <\/b>der <b>FileTable <\/b>zu dem zugeh&ouml;rigen Verzeichnis (hier <b>\\\\Amvdesktop2023\\SQLEXPRESS\\FileTableDB\\tblFileTable<\/b>) und kopieren dort einfach einmal eine Datei hinein.<\/p>\n<p>Die Datei erscheint im Verzeichnis, weiter geschieht offensichtlich nichts. Wenn wir anschlie&szlig;end allerdings einen Blick in die Tabelle <b>tblFileTable<\/b> im SQL Server Management Studio werfen und f&uuml;r diese Tabelle den Kontextmen&uuml;-Eintrag <b>Erste 1000 Zeilen ausw&auml;hlen <\/b>anklicken, finden wir dort einen neuen Eintrag vor (siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_013.png\" alt=\"Die neue Datei in der Tabelle tblFileTable\" width=\"700\" height=\"112,115\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Die neue Datei in der Tabelle tblFileTable<\/span><\/b><\/p>\n<p>Bevor wir einen genaueren Blick auf die Spalten werfen, schauen wir uns noch an, was geschieht, wenn wir ein komplettes Verzeichnis samt Dateien und Unterverzeichnissen in das <b>FileTable<\/b>-Verzeichnis kopieren. <\/p>\n<p>Es funktioniert &#8211; die kompletten Dateien werden wie gew&uuml;nscht gespeichert. Die Eintr&auml;ge in der Tabelle <b>tblFileTable <\/b>sehen nun aus wie folgt aus (siehe Bild 16).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_014.png\" alt=\"Ordner mit weiteren Dateien in der FileTable\" width=\"700\" height=\"289,8437\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Ordner mit weiteren Dateien in der FileTable<\/span><\/b><\/p>\n<p>Hier wird sowohl f&uuml;r Dateien als auch f&uuml;r Verzeichnisse jeweils ein Datensatz angelegt. Die Tabelle enth&auml;lt folgende Spalten:<\/p>\n<ul>\n<li><b>stream_id<\/b>: GUID-Spalte mit eindeutigen Werten zur Kennzeichnung der <b>FILESTREAM<\/b>-Daten<\/li>\n<li><b>file_stream<\/b>: Inhalt der Datei<\/li>\n<li><b>name<\/b>: Name der Datei oder des Verzeichnisses<\/li>\n<li><b>path_locator<\/b>: Prim&auml;rschl&uuml;ssel der Tabelle<\/li>\n<li><b>parent_path_locator<\/b>: Prim&auml;rschl&uuml;ssel des Datensatzes der Tabelle mit dem &uuml;bergeordneten Verzeichnis, kann f&uuml;r Elemente der obersten Ebene auch <b>NULL <\/b>sein.<\/li>\n<li><b>file_type<\/b>: Dateiart<\/li>\n<li><b>cached_file_size<\/b>: Dateigr&ouml;&szlig;e<\/li>\n<li><b>creation_time<\/b>: Erstellungsdatum der Datei<\/li>\n<li><b>last_write_time<\/b>: &Auml;nderungsdatum der Datei<\/li>\n<li><b>last_access_time<\/b>: Letzter Zugriff auf die Datei<\/li>\n<li><b>is_directory<\/b>: Gibt an, ob es sich um ein Verzeichnis handelt.<\/li>\n<li><b>is_offline<\/b>: Gibt an, ob die Datei offline ist.<\/li>\n<li><b>is_hidden<\/b>: Gibt an, ob die Datei als versteckt gekennzeichnet ist.<\/li>\n<li><b>is_readonly<\/b>: Gibt an, ob die Datei schreibgesch&uuml;tzt ist.<\/li>\n<li><b>is_archive<\/b>: Gibt an, ob es sich um eine Archivdatei handelt.<\/li>\n<li><b>is_system<\/b>: Gibt an, ob die Datei eine Systemdatei ist.<\/li>\n<li><b>is_temporary<\/b>: Gibt an, ob es sich um eine tempor&auml;re Datei handelt.<\/li>\n<\/ul>\n<p>In den markierten Spalten sehen wir einerseits sowohl Dateinamen als auch Ordnernamen und andererseits &uuml;ber das Feld <b>parent_path_locator <\/b>die Zuordnung zu den Verzeichnissen, falls es ein &uuml;bergeordnetes Verzeichnis gibt.<\/p>\n<h2>Verschiedene T-SQL-Anweisungen f&uuml;r FileTables<\/h2>\n<p>Nachfolgend findest Du einige Beispiele f&uuml;r den Zugriff per T-SQL auf die in FileTable-Tabellen gespeicherten Daten.<\/p>\n<h2>Alle Dateien ausgeben<\/h2>\n<p>Um die Namen aller Dateien auszugeben, selektieren wir das Feld <b>name <\/b>f&uuml;r alle Datens&auml;tze, deren Feld <b>is_directory <\/b>den Wert <b>0 <\/b>hat:<\/p>\n<pre>SELECT name FROM dbo.tblFileTable WHERE is_directory = 0<\/pre>\n<h2>Alle Verzeichnisse ausgeben<\/h2>\n<p>Auf &auml;hnliche Weise k&ouml;nnen wir alle Verzeichnisse ermitteln. Hier filtern wir <b>is_directory <\/b>nach dem Wert <b>1<\/b>:<\/p>\n<pre>SELECT name FROM dbo.tblFileTable WHERE is_directory = 1<\/pre>\n<h2>Rootverzeichnis ermitteln<\/h2>\n<p>In der folgenden Abfrage nutzen wir die Funktion <b>FileTableRootPath<\/b>, um das Root-Verzeichnis der verschiedenen Eintr&auml;ge der <b>FileTable<\/b>-Tabelle zu ermitteln:<\/p>\n<pre>SELECT name, FileTableRootPath()<span style=\"color:blue;\"> As <\/span>Root\r\nFROM dbo.tblFileTable WHERE is_directory = 0<\/pre>\n<h2>Pfad unterhalb des Rootverzeichnisses ermitteln<\/h2>\n<p>Wenn wir den Pfad vom Root-Verzeichnis zu den einzelnen Dateien ermitteln wollen, k&ouml;nnen wir dazu die Funktion <b>file_stream.GetFileNamespacePath<\/b> nutzen:<\/p>\n<pre>SELECT name, file_stream.GetFileNamespacePath()<span style=\"color:blue;\"> As <\/span>Speicherort\r\nFROM dbo.tblFileTable WHERE is_directory = 0<\/pre>\n<p>Aus diesen beiden k&ouml;nnen wir auch den vollst&auml;ndigen Pfad zusammensetzen:<\/p>\n<pre>SELECT name, CONCAT(FileTableRootPath(),     file_stream.GetFileNamespacePath())<span style=\"color:blue;\"> As <\/span>Pfad\r\n     FROM dbo.tblFileTable WHERE is_directory = 0<\/pre>\n<h2>Dateiname &auml;ndern<\/h2>\n<p>Das &Auml;ndern des Dateinamens erfolgt unkompliziert durch eine solche <b>UPDATE<\/b>-Anweisung:<\/p>\n<pre>UPDATE dbo.tblFileTable SET name = ''pic999.png'' WHERE name = ''pic001.png''<\/pre>\n<p>Aber Vorsicht: Wenn wir hier nicht den Pfad mit angeben, wird der Name aller Dateien mit dem im Filterkriterium angegebenen Namen ge&auml;ndert!<\/p>\n<p>Wir sollten also hier beispielsweise noch den Pfad angeben:<\/p>\n<pre>UPDATE dbo.tblFileTable SET name = ''pic999.png''     WHERE file_stream.GetFileNamespacePath() = \r\n     ''\\tblFileTable\\pic001.png''<\/pre>\n<h2>Dateien l&ouml;schen<\/h2>\n<p>Das L&ouml;schen von Dateien erledigen wir per <b>DELETE<\/b>-Anweisung. Verzeichnisse k&ouml;nnen dabei nur gel&ouml;scht werden, wenn diese leer sind. Diese Aktion f&uuml;hren wir daher am besten direkt &uuml;ber entsprechende VBA-Befehle aus, sofern wir Schreibrechte f&uuml;r dieses Verzeichnis f&uuml;r andere Benutzer definiert haben.<\/p>\n<p>Dies wird durch die Festlegung referenzieller Integrit&auml;t ohne L&ouml;schweitergabe realisiert. Die folgende Anweisung l&ouml;scht eine Datei:<\/p>\n<pre>DELETE FROM dbo.tblFileTable WHERE name = ''pic002.png''<\/pre>\n<h2>Neues Verzeichnis erstellen<\/h2>\n<p>Ein neues Verzeichnis erstellen wir wie folgt:<\/p>\n<pre>INSERT INTO tblFileTable(name, is_directory) VALUES(''Neues Verzeichnis'', 1)<\/pre>\n<p>Wir legen also einen neuen Datensatz an, der den Namen des gew&uuml;nschten Verzeichnisses enth&auml;lt und den Wert <b>1 <\/b>f&uuml;r <b>is_directory<\/b>.<\/p>\n<h2>Dateien und Ordner &uuml;ber den Windows-Explorer bearbeiten<\/h2>\n<p>Und schlie&szlig;lich k&ouml;nnen wir mit entsprechender Freigabe auch noch Dateien und Ordner direkt im Windows Explorer hinzuf&uuml;gen, l&ouml;schen, verschieben, umbenennen und so weiter.<\/p>\n<h2>Datei per T-SQL zu FileTable hinzuf&uuml;gen<\/h2>\n<p>Nun werden wir nicht immer Dateien per Drag and Drop &uuml;ber den Windows Explorer zur <b>FileTable <\/b>hinzuf&uuml;gen wollen, sondern dies mitunter auch programmatisch erledigen wollen. Die Grundlage dazu bietet T-SQL.<\/p>\n<p>Die folgende Abfrage f&uuml;gt beispielsweise eine Bilddatei namens <b>pic002.png <\/b>zum Root-Verzeichnis der <b>FileTable <\/b>hinzu. Dabei verwendet sie das <b>OPENROWSET<\/b>-Schl&uuml;sselwort, &uuml;ber das wir wie folgt auf Dateien im Dateisystem zugreifen k&ouml;nnen:<\/p>\n<pre>INSERT INTO dbo.tblFileTable (name, file_stream) \r\nSELECT ''pic002.png'', * FROM OPENROWSET(\r\n     BULK N''C:\\Users\\User\\...\\pic002.png'', SINGLE_BLOB) \r\n         AS FileData<\/pre>\n<p>Diese Anweisung legt einen neuen Datensatz in der Tabelle <b>tblFileTable <\/b>an und speichert die angegebene Datei darin. Dabei legt sie den Namen <b>pic002.png <\/b>als Dateinamen fest.<\/p>\n<p>Dies ist n&ouml;tig, da die beiden Felder <b>name <\/b>und <b>file_stream <\/b>beim Hinzuf&uuml;gen eines Datensatzes angegeben werden m&uuml;ssen.<\/p>\n<p>Die &uuml;brigen Felder werden automatisch gef&uuml;llt.<\/p>\n<h2>Freigabe von Ordnern f&uuml;r das SQL Server-Dienstkonto<\/h2>\n<p>Wenn wir die obige Anweisung zum Einf&uuml;gen einer Datei oder eines Verzeichnisses aus dem Dateisystem in die <b>FileTable<\/b>-Tabelle durchf&uuml;hren, kann folgender Fehler auftreten:<\/p>\n<pre>Massenladen ist nicht m&ouml;glich. Die Datei \"C:\\...\\pic001.png\" ist nicht vorhanden, oder Sie besitzen keine Rechte f&uuml;r den Dateizugriff.<\/pre>\n<p>Letzteres ist der Fall, denn egal, von wo aus wir die Anweisung ausf&uuml;hren: Letztlich ist es die SQL Server-Instanz, die auf die Datei zugreifen muss, um diese in die <b>FileTable<\/b>-Tabelle einzuf&uuml;gen. Und der SQL Server l&auml;uft unter einem anderen Benutzerkonto als der aktuelle Benutzer, der nat&uuml;rlicherweise Zugriff auf das Verzeichnis mit der zu importierenden Bilddatei hat.<\/p>\n<p>Bei diesem Konto handelt es sich um das Dienstkonto der jeweiligen SQL Server-Instanz. Diese hat nat&uuml;rlicherweise keine Berechtigungen, auf andere Verzeichnisse als auf die dem SQL Server zugewiesenen zuzugreifen. Dazu geh&ouml;ren unter anderem die Verzeichnisse beispielsweise unterhalb von <b>C:\\Program Files\\Microsoft SQL Server\\MSSQL17.SQLEXPRESS\\MSSQL<\/b>, wo sich die Ordner f&uuml;r die SQL Server-Datenbanken (im Ordner <b>DATA<\/b>) und die Sicherungen befinden (im Ordner <b>Backup<\/b>).<\/p>\n<p>Au&szlig;erdem werden nat&uuml;rlich die Verzeichnisse f&uuml;r <b>FILESTREAM <\/b>und die <b>FileTable<\/b>-Tabellen mit entsprechenden Berechtigungen versehen.<\/p>\n<p>Wir m&uuml;ssen dem Dienstkonto des SQL Servers also Zugriff auf das Verzeichnis geben, in dem sich die einzulesenden Dateien f&uuml;r die <b>FileTable<\/b>-Tabelle befinden.<\/p>\n<p>Dazu m&uuml;ssen wir erst einmal das Dienstkonto ermitteln. Das gelingt zum Gl&uuml;ck schnell im SQL Server Management Studio mit der folgenden Abfrage:<\/p>\n<pre>&lt;b&gt;SELECT servicename, service_account, startup_type_desc, \r\n&lt;b&gt;    status_desc\r\n&lt;b&gt;FROM sys.dm_server_services;<\/pre>\n<p>Dies liefert in unserem Fall das Ergebnis aus Bild 17.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_022.png\" alt=\"Ermitteln des SQL Server-Dienstkontos\" width=\"599,6265\" height=\"102,6824\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Ermitteln des SQL Server-Dienstkontos<\/span><\/b><\/p>\n<p>Hier kopieren wir den Eintrag aus der Spalte <b>service_account <\/b>in die Zwischenablage (<b>NT Service\\MSSQL$SQLEXPRESS<\/b>).<\/p>\n<p>Dann navigieren wir im Windows Explorer zu dem Ordner, der die in die <b>FileTable<\/b>-Tabelle zu importierenden Dateien enth&auml;lt und &ouml;ffnen &uuml;ber das Kontextmen&uuml; die Eigenschaften. Hier wechseln wir zum Bereich <b>Sicherheit <\/b>und klicken auf <b>Bearbeiten<\/b>. Dies &ouml;ffnet einen weiteren Dialog namens <b>Berechtigungen f&uuml;r &#8220;Ordnername&#8221;<\/b>.<\/p>\n<p>Hier klicken wir auf <b>Hinzuf&uuml;gen<\/b>, was den n&auml;chsten Dialog <b>Benutzer oder Gruppen ausw&auml;hlen <\/b>&ouml;ffnet. In das Feld unten geben wir den Namen des Dienstkontos f&uuml;r den SQL Server ein (siehe Bild 18).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_023.png\" alt=\"Der eingegebene Name des Dienstkontos wird nach einem Klick auf Namen &uuml;berpr&uuml;fen ...\" width=\"424,6267\" height=\"233,2195\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Der eingegebene Name des Dienstkontos wird nach einem Klick auf Namen &uuml;berpr&uuml;fen &#8230;<\/span><\/b><\/p>\n<p>Klicken wir dann auf <b>Namen &uuml;berpr&uuml;fen<\/b>, &auml;ndert sich der Eintrag gegebenenfalls wie in Bild 19.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_488_024.png\" alt=\"... in dieses Konto umgewandelt.\" width=\"424,6267\" height=\"233,2195\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: &#8230; in dieses Konto umgewandelt.<\/span><\/b><\/p>\n<p>Danach schlie&szlig;en wir alle offenen Dialoge mit <b>OK <\/b>und versuchen erneut, die Abfrage auszuf&uuml;hren. Diesmal gelingt es, somit haben wir erst einmal grundlegend gesehen, dass wir Zugriff auf den Ordner haben.<\/p>\n<h2>Alternative L&ouml;sung: Zwischenordner mit Benutzer- und SQL Server-Rechten<\/h2>\n<p><b>Vorweg eine Warnung<\/b>: Man k&ouml;nnte nun auf die Idee kommen und weite Teile seines Dateisystems f&uuml;r das SQL Server-Dienstkonto freizugeben. Das ist eine schlechte Idee, denn damit sind erh&ouml;hte Sicherheitsrisiken verbunden.<\/p>\n<p>Man kann mit dem SQL Server nicht nur Dateien in eine <b>FileTable<\/b>-Tabelle einlesen, sondern auch Befehle des Dateisystems ausf&uuml;hren. Dazu k&ouml;nnte man die gespeicherte Prozedur <b>xp_cmdshell <\/b>nutzen, der man Befehle wie <b>del &#8220;c:\\Bilder\\*&#8221; <\/b>&uuml;bergeben kann.<\/p>\n<p>Um dies auszuschlie&szlig;en, k&ouml;nnte man, wenn man zum Beispiel von Access aus Daten in eine <b>FileTable<\/b>-Tabelle schreiben m&ouml;chte, nur genau ein Verzeichnis f&uuml;r den Zugriff durch den Benutzer und gleichzeitig f&uuml;r das Dienstkonto des SQL Servers freigeben.<\/p>\n<p>Dann w&uuml;rde man die Dateien, die man zur <b>FileTable<\/b>-Tabelle hinzuf&uuml;gen m&ouml;chte, zun&auml;chst in dieses Transferverzeichnis kopieren und dann mit dem entsprechenden T-SQL-Befehl die Datei in die <b>FileTable<\/b>-Tabelle schreiben.<\/p>\n<p>Wenn wir davon ausgehen, dass wir in der Regel nur einzelne, nicht allzu gro&szlig;e Dateien in die <b>FileTable<\/b>-Tabelle schreiben wollen, ist dies kein allzu gro&szlig;es Performance-Problem.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel zeigt, wie wir im SQL Server mit FileTables arbeiten und damit eine M&ouml;glichkeit erhalten, Dateien im SQL Server zu speichern und weiterhin auch &uuml;ber das Dateisystem auf diese zugreifen zu k&ouml;nnen.<\/p>\n<p>In einem weiteren Artikel namens <b>Access und SQL Server-FileTables <\/b>(<b>www.vbentwickler.de\/489<\/b>) zeigen wir, wie der Zugriff auf diese <b>FileTable<\/b>-Tabelle von Access aus funktioniert.<\/p>\n<p>Hier schauen wir uns an, wie wir zum Beispiel<\/p>\n<ul>\n<li>Bilder, die in der <b>FileTable<\/b>-Tabelle gespeichert sind, in einem Bild-Steuerelement in Access anzeigen k&ouml;nnen,<\/li>\n<li>wie wir von Access Dateien und Ordner zur <b>FileTable<\/b>-Tabelle hinzuf&uuml;gen und<\/li>\n<li>wie wir die in der <b>FileTable<\/b>-Tabelle gespeicherten Ordner und Dateien mit den Daten aus anderen Tabellen verkn&uuml;pfen k&ouml;nnen.<\/li>\n","protected":false},"excerpt":{"rendered":"<p>In Access gibt es verschiedene M&ouml;glichkeiten, Dateien zu speichern. Diese kann man zum Beispiel in Anlagefeldern ablegen, oder man bel&auml;sst die eigentlichen Dateien im Dateisystem und notiert in den Tabellen lediglich den Pfad zu den Dateien oder auch nur die Dateinamen. Welche Variante man w&auml;hlt, h&auml;ngt letztlich von der Menge und der Gr&ouml;&szlig;e der Dateien ab, sprich: vom ben&ouml;tigten Speicherplatz. Der ist n&auml;mlich in Access-Datenbanken auf zwei Gigabytes begrenzt. In SQL Server-Datenbanken sieht dies ganz anders aus. Selbst bei Verwendung der kostenlosen Express-Edition d&uuml;rfen die einzelnen Datenbank-Dateien bis zu zehn Gigabytes an Platz auf der Festplatte einnehmen. Auch hier gibt es verschiedene Varianten zum Speichern der Dateien. Die erste ist, die Dateien in varbinary(max)-Feldern zu hinterlegen. Oder man nutzt dazu sogenannte Filetables. Hier werden die Dateien in einem speziell dazu vorgesehenen Bereich der Festplatte abgelegt, aber unter die Kontrolle des SQL Servers gestellt &#8211; und gleichzeitig &uuml;ber einen speziellen Typ von Tabelle verwaltet. Wie das gelingt, zeigen wir in diesem Artikel.<\/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":[662025,66052025,44000034,44000027,44000026,44000030,44000006],"tags":[],"yst_prominent_words":[],"class_list":["post-55000488","post","type-post","status-publish","format-standard","hentry","category-662025","category-66052025","category-COMAddIns_programmieren","category-Excel_programmieren","category-Outlook_programmieren","category-PowerPoint_programmieren","category-SQL_Server_und_Co"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000488","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000488"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000488\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000488"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}