SQL Server 2012 - Neue Funktionen FILETABLE

Heute habe ich mich etwas näher mit der neuen Funktion FILETABLES in SQL Server 2012 beschäfftigt. Mit dem SQL Server 2008 kam das neues Feature FILESTREAM, mit dem es möglich war Dokumente, Videos, Bilder und sonstige binäre Daten (in der Datenbanksprache als BLOBs bezeichnet) in einem Dateisystem abzulegen. Dies sollte dazu führen das die Datenbank klein blieb und nur ein Verweis auf diese Datei in der Datenbank gespeichert wurde. Jedoch hatte diese neue Funktion einige Nachteile. Bis zu einer Größe von 1MB war der Zugriff über T-SQL performant, waren die Dateien größer mußte man dazu übergehen die Dateien über die WIN32-API aufzurufen. Des weiteren war zu beachten das das Löschen von Dateien innerhalb der Verzeichnisse, zu einer korrupten Datenbank führen konnte. Daher wurde sehr oft trotz FILESTREAM der alte Weg beschritten und nur der Pfad in der Datenbank gespeichert und die Datei selber seperat im Verzeichnis was zu einem höheren Verwaltungsaufwand führte.
Dies wurde jetzt mit der neuen Funktion FILETABLE gewährleistet. Es ist ein traditioneller Dateizugriff aus Anwendungen wie Word, Explorer u.ä. möglich sowie gleichzeitig die Nutzung der SQL Server Features wie vollständige Backups und Volltextsuche.
Im Grunde handelt es sich dabei um eine Tabelle mit festen Schema, in der Dokumente gespeichert werden, die einerseits über T-SQL verfügbar sind und zum anderen ganz normale über das Windows Dateisystem. Um FILETABLES nutzen zu können, muß FILESTREAM aktiviert sein. Im Idealfall richtet man dies bereits bei der Installation des SQL-Servers ein.

Filestream

Sollte es später zusätzlich aktiviert werden, geschieht dies über den SQL Server-Konfigurations-Manager. Eine ausführliche Anleitung dazu, finden man unter: http://msdn.microsoft.com/de-de/library/cc645923.aspx
Zusätzlich zu dieser Aktivierung muss eine Filestream-Dateigruppe angelegt werden. Diese Dateigruppe zeigt auf ein bestimmtes Verzeichnis und legt so den physikalischen Speicherplatz für die Dateien der FILETABLE fest. Dies kann am besten bei der Erstellung der Datenbank mit erfolgen, wie im nachfolgenden Beispiel gezeigt:

CREATE DATABASE FILES
ON
PRIMARY ( NAME = FilesData,
FILENAME = 'c:\sqldb\FilesData.mdf'),
FILEGROUP FilesStream CONTAINS FILESTREAM( NAME = FilesStream,
FILENAME = 'c:\sqldb\filestream1')
LOG ON  ( NAME = FilesLog,
FILENAME = 'c:\sqldb\FilesLog.ldf')
GO

 

Filegroup

Danach muß der "nicht-transaktionale Zugriff" frei geschaltet werden. Dies erfolgt mittels T-SQL über folgenden Befehl:

ALTER DATABASE FILES
SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'FilesDir')
GO


Dies betrifft jedoch nur die Zugriffe über das Windows Dateisystem (also Explorer u.ä.). Es kann also dabei kein Rollback durchgeführt werden. Für Zugriffe über T-SQL oder das Filestream-API ist dies nicht zutreffend. Diese sind voll transaktional.
Ist dies erledigt, kann die Filetable angelegt werden, wie in folgendem Beispiel:

CREATE TABLE dbo.MeineFiles AS FILETABLE
WITH
(
FILETABLE_DIRECTORY = 'MeineFilesDir',
FILETABLE_COLLATE_FILENAME = database_default
)
GO

Da das Schema der Tabelle, wie bereits geschrieben, fest ist, ist die Angabe eines Schemas nicht notwendig. Auch können keine weiteren Spalten hinzu gefügt werden, noch können Spalten geändert oder gelöscht werden. Folgende Abfrage gibt den Dokumentnamen und den entsprechenden Pfad zurück:

SELECT    Name
, FileTableRootPath() + file_stream.GetFileNamespacePath() AS File
FROM MeineFiles

Dateiname: Installation Report Builder 2.docx
FilesPath: \\FKRAHL-WIN7\MSSQLSERVER\FilesDir\MeineFilesDir\Installation Report Builder 2.docx

Über das SQL Managment Studio ist es auch einfach möglich, einen Ordner mit dem entsprechenden Pfad zu öffnen.

Filetable

Es kann aber auch jederzeit über das Windows Dateisystem darauf zugegriffen werden.

Filefolder

In diesen Ordner kann man nun die Dateien kopieren, bearbeiten und löschen. In der entsprechenden FILETABLE Tabelle existiert für jede Datei bzw. Unterordner eine Zeile, die automatisch beim kopieren erstellt wird bzw. beim löschen entfernt wird. Damit bieten die FILETABLES eine gute Kombination aus klassischem Dateizugriff und T-SQL und erlauben somit die datenbankbasierte Nutzung von Dokumenten.