Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/850 33-0

Neuerungen in SQL Server 2008: FILESTREAM Storage

Große BLOBs (Videos, Word-Dokumente etc.) konnte man in MS SQL Server bisher entweder in der Datenbank (langsam) oder im Filesystem (unsicher, keine Transaktionen) ablegen. FILESTREAM Storage vereint die Vorteile von beiden.

Das Konzept von FILESTREAM integriert das SQL ServerDatenbankmodul in ein NTFS-Dateisystem: BLOB-Daten vom Typ varbinary(max) werden im Dateisystem gespeichert. Dadurch greift nicht die für varbinary(max) definierte Größenbeschränkung auf 2 GB, sondern die Größe der Dateien ist lediglich durch den verfügbaren Speicherplatz auf dem Laufwerk begrenzt. Ansonsten können FILESTREAM-Daten ganz normal mit Transact-SQL-Anweisungen abgefragt, eingefügt, geändert oder gelöscht werden – das alles natürlich wie gehabt incl. Transaktionen und Datenbanksicherheit (mittels Berechtigungen auf Tabellen- oder Spaltenebene – nur das SQL Server Dienstkonto erhält Zugriff auf die Daten im Dateisystem). Desweiteren  können alle Verwaltungsfunktionen genutzt werden, z.B. zum Sichern und Wiederherstellen.

Und wie geht das?

Zuerst muss FILESTREAM Storage aktiviert werden.

Dies kann man entweder bereits bei der Installation von SQL Server 2008 erledigt haben:

Aktivieren von FILESTREAM bei SQL 2008 Installation

… oder man muss es nachträglich im SQL Server Configuration Manager tun:

  • -> Start -> Programme -> SQL Server 2008 -> Konfigurationstools -> SQL Server Configuration Manager
  • zur gewünschten SQL Server Instanz navigieren -> Eigenschaftsdialog öffnen
  • Registerkarte FILESTREAM-> Checkboxen „FILESTREAM für Transact-SQL-Zugriff aktivieren“ und „FILESTREAM für E/A-Streamingzugriff auf Datei aktivieren“ aktivieren und einen Freigabenamen für den Datei-Speicherort eingeben
  • Wenn Remote Clients auf die FILESTREAM-Daten zugreifen sollen, dann auch die Checkbox „Streamingzugriff von Remoteclients auf FILESTREAM-Daten zulassen“ aktivieren

Aktivieren von FILESTREAM im SQL Configuration Manager

  • Im SQL Management Studio muss zusätzlich folgende Abfrage ausgeführt werden, um FILESTREAM für Transact-SQL und für den Win32-Streamingzugriff zu aktivieren:EXEC sp_configure filestream_access_level, 2
    RECONFIGURE

Dann kann eine FILESTREAM-aktivierte Datenbank erstellt werden:

CREATE DATABASE Test
ON
PRIMARY ( NAME = test1,
FILENAME = ‚c:\data\testdat1.mdf‘),
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = test3,
FILENAME = ‚c:\data\filestream1‘)
LOG ON  ( NAME = testlog1,
FILENAME = ‚c:\data\testlog1.ldf‘)
GO

Wenn FILESTREAM nachträglich für eine bereits vorhandene Datenbank aktiviert werden soll, müssen folgende Abfragen ausgeführt werden:

ALTER DATABASE Test ADD
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM;
GO

ALTER DATABASE Test ADD FILE (
NAME = FSGroup1File,
FILENAME = ‚c:\data\filestream1‘)
TO FILEGROUP FileStreamGroup1;
GO

Achtung!
Das Verzeichnis „filestream1“ darf noch nicht vorhanden sein, es wird automatisch angelegt und ist erst einmal leer bis auf die Datei filestream.hdr und den Ordner $FSLOG.

Zu guter Letzt muss eine Tabelle zum Speichern von FILESTREAM-Daten erstellt werden:

CREATE TABLE Test.dbo.Documents (
DocumentID INT IDENTITY PRIMARY KEY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocumentGuid UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE)
FILESTREAM_ON FileStreamGroup1;
GO

Eine Spalte mit FILESTREAM-Daten ist eine varbinary(max)-Spalte mit FILESTREAM-Attribut. Eine ROWGUIDCOL-Spalte ist nur für die Verwendung von FILESTREAM-Daten mit Win32-APIs erforderlich.

Nun können nach Belieben mit Transact SQL Daten eingefügt, abgefragt etc. werden:

INSERT INTO Test.dbo.Documents
VALUES (1, newid (), CAST (‚Das ist ein Test‘ as varbinary(max)));
GO

UPDATE Test.dbo.Documents
SET Document = CAST (‚Das ist noch ein Test‘ as varbinary(max)))
WHERE DocumentID = 1;
GO

DELETE Test.dbo.Documents WHERE DocumentID = 1;
GO

Anmerkung:
Das Ändern großer Datenmengen ist mit Transact SQL zwar möglich, aber nicht empfehlenswert. Zum Schreiben großer Datenmengen verwendet man besser die Win32-API (aber das ist eine andere Geschichte, die soll ein andermal erzählt werden…)

Zum Abschluss noch einige Überlegungen zum Einsatz von FILESTREAM:

  • FILESTREAM-Speicherung is sinnvoll bei Objekten, die im Schnitt größer als 1 MB sind.
  • FILESTREAM-Speicherung is sinnvoll, wenn schneller Lesezugriff wichtiger ist als schneller Schreibzugriff.
  • FILESTREAM-Daten werden nicht verschlüsselt (auch dann nicht, wenn die transparente Datenverschlüsselung aktiviert ist).

Kommentar hinterlassen


Pin It on Pinterest