Einleitung
Dieser Artikel unterstützt Sie bei der Auslagerung von eingebetteten Dateien Ihrer Microsoft SQL Server-Datenbank in das Dateisystem mittels FILESTREAM. Diese Vorgehensweise erlaubt es Ihnen, die Datenbankgröße gering zu halten, da die Dateien vom SQL Server aus dem Dateisystem gestreamt werden und die Größenbeschränkung der Datenbank (bei MS SQL Server Express) somit weniger relevant erscheint. Eine Anwendung dieser Methode könnte sich bereits lohnen, wenn die zu speichernden Objekte im Durchschnitt größer als 1 Megabyte sind und ein schneller Lesezugriff wichtig ist.
Wichtig: FILESTREAM benötigt eine SQL Server Enterprise Edition.
Weitere Informationen hierzu finden Sie auch unter FILESTREAM (SQL Server) - SQL Server | Microsoft Learn.
Hinweis: FILESTREAM-Daten können nicht verschlüsselt werden.
Durchführung der Umstellung
Achtung: Führen Sie die nachfolgenden Schritte nur aus, wenn in Ihrer Datenbank noch keine oder nicht mehr benötigte Dokumente vorhanden sind. Ansonsten verfahren Sie bitte wie im Abschnitt
Durchführung der Umstellung mit gleichzeitiger Auslagerung eingebetteter Dokumente
beschrieben fort.
Die folgenden Schritte werden anhand der combit CRM-Datenbank „combit_Large??“ erklärt und die SQL-Abfragen beziehen sich auf deren Tabellen (ersetzen Sie an allen Stellen ??
durch die tatsächliche Version Ihrer Datenbank). combit CRM sollte während der Durchführung nicht aktiv sein und kein Anwender sollte in der Datenbank arbeiten. Bitte erstellen Sie vor der Durchführung der folgenden Schritte eine komplette Sicherung Ihrer Daten.
Aktivierung von FILESTREAM in der verwendeten SQL Server-Instanz
Damit FILESTREAM verwendet und konfiguriert werden kann, muss es vorher in den Eigenschaften der verwendeten SQL Server-Instanz aktiviert werden. Folgende Schritte sind dafür notwendig:
-
Öffnen Sie zunächst den
SQL Server-Konfigurations-Manager
über das Windows-Startmenü. -
Führen Sie in der linken Leiste einen Rechtsklick auf
SQL-Server Dienste
aus und wählen Sie anschließendÖffnen
. -
Markieren Sie nun auf der rechten Seite die entsprechende SQL Server-Instanz, auf welcher FILESTREAM aktiviert werden soll und wählen
Eigenschaften
aus dem Rechtsklick-Kontextmenü. -
Wechseln Sie im Eigenschaften-Dialog nun auf die Registerkarte
FILESTREAM
und aktivieren Sie die OptionFILESTREAM für Transact-SQL-Zugriff aktivieren
. -
Wenn ein Lesen und Schreiben der FILESTREAM-Daten über Windows erforderlich sein sollte, dann aktivieren Sie zusätzlich die Option
FILESTREAM für E/A-Dateizugriff aktivieren
. Geben Sie anschließend den Windows-Freigabenamen ein. -
Falls Remoteclients auf FILESTREAM-Daten dieser Freigabe zugreifen müssen, aktivieren Sie zusätzlich die Option
Zugriff von Remoteclients auf FILESTREAM-Daten zulassen
. -
Bestätigten Sie die vorgenommen Änderungen nun mit
OK
. -
Nach Aktivierung von FILESTREAM im
SQL Server-Konfigurations-Manager
ist es zwingend erforderlich, den FILESTREAM-Zugriffslevel anzupassen. Öffnen Sie dazu imSQL Server Management Studio
eine neue Abfrage und geben die folgenden Zeilen ein:-- Change FILESTREAM Access Level to 2 - Default: 0 EXEC sp_configure filestream_access_level, 2 RECONFIGURE
Führen Sie die Abfrage anschließend über
Ausführen
für die Datenbankmaster
aus. -
Wechseln Sie nun zurück in den
SQL Server-Konfigurations-Manager
und starten Sie den SQL Server-Dienst neu. Beenden Sie nun denSQL Server-Konfigurations-Manager
.
Sicherstellen der benötigten RowGuid-Feldeigenschaft
Standardmäßig ist dies in der combit_Large??
-Datenbank bereits korrekt eingestellt. Um dies ggf. zu überprüfen, öffnen Sie im SQL Server Management Studio
in der Datenbank combit_Large??
die Tabelle Activities
über Entwerfen
im Kontextmenü. Markieren Sie dort die Spalte ID
und stellen Sie sicher, dass die Eigenschaft RowGuid
auf Ja
steht.
Erzeugen einer neuen Dateigruppe
Für den FILESTREAM benötigt die SQL Server-Datenbank eine sogenannte Dateigruppe, welcher eine Datei zugeordnet wird. Öffnen Sie dazu im SQL Server Management Studio
eine neue Abfrage und geben die folgenden Zeilen ein:
-- Add a file group
ALTER Database combit_Large??
Add FILEGROUP DocumentsGroup
CONTAINS FILESTREAM
GO
-- Add a file for storing database documents to DocumentsGroup
ALTER Database combit_Large??
Add FILE
(
NAME = 'DocumentsFile',
FILENAME = 'C:\DOCS\FILESTREAM\DocFile.ndf'
)
TO FILEGROUP DocumentsGroup
GO
Führen Sie die Abfrage anschließend über Ausführen
aus.
Wichtig: Der Pfad
C:\DOCS\FILESTREAM\
muss vorhanden sein bzw. vorher angelegt werden, wobei hingegen der OrdnerDocFile.ndf
nicht existieren darf! Diese Ordner können an einem beliebigen Ort auf Ihrem System liegen.
Nach der Ausführung der SQL-Abfrage sollten in dem Ordner C:\DOCS\FILESTREAM\
der Ordner DocFile.ndf
und darin die Datei filestream.hdr
vorhanden sein. Die Datei filestream.hdr
ist eine wichtige Systemdatei, die FILESTREAM-Headerinformationen enthält. Diese Datei darf nicht entfernt oder geändert werden.
Sicherstellen des benötigten Datentyps
Im letzten Schritt muss in der Tabelle Activities
für die Spalte Document_Embedded
der Datentyp auf varbinary(MAX)
angepasst (standardmäßig ist dies in der combit_Large??
-Datenbank bereits korrekt eingestellt). Außerdem muss diese Spalte mit der FILESTREAM-Eigenschaft versehen werden, wofür diese zunächst gelöscht und anschließend neu erstellt werden muss. Öffnen Sie dazu im SQL Server Management Studio
eine neue Abfrage und geben die folgenden Zeilen ein:
-- Delete Column 'Document_Embedded'
ALTER Table Activities
DROP Column Document_Embedded
-- Add Field 'Document_Embedded' with different fieldtype and arguments
ALTER Table Activities
ADD Document_Embedded VARBINARY(MAX) FILESTREAM Null
Führen Sie die Abfrage anschließend über Ausführen
für die Datenbank combit_Large??
aus.
Durchführung der Umstellung mit gleichzeitiger Auslagerung eingebetteter Dokumente
Um FILESTREAM zu aktivieren und gleichzeitig bestehende eingebettete Dokument auszulagern, gehen Sie bitte wie folgt vor.
Aktivierung von FILESTREAM in der verwendeten MS SQL-Instanz
Siehe oben.
Sicherstellen der benötigten RowGuid-Feldeigenschaft
Siehe oben.
Achtung: Wenn die Tabelle bereits in einer Replikation verwendet wird, dann muss diese vorher aus der Replikation entfernt und nach Abschluss wieder hinzugefügt werden. Ein erneutes Initialisieren des Snapshots ist notwendig!
Erzeugen einer neuen Dateigruppe
Siehe oben.
Hinzufügen eines neuen FILESTREAM-Felds
Damit die bereits vorhandenen Feldinhalte später übernommen werden können, wird ein zusätzliches Feld für den FILESTREAM benötigt. Öffnen Sie dazu im SQL Server Management Studio
eine neue Abfrage und geben die folgenden Zeilen ein:
ALTER Table Activities
ADD Document_Filestream VARBINARY(MAX) FILESTREAM Null
Führen Sie die Abfrage anschließend über Ausführen
für die Datenbank combit_Large??
aus.
Abgleichen des BLOB-Felds mit dem FILESTREAM-Feld
Damit nun die Inhalte aus dem bisherigen BLOB-Feld Document_Embedded
in das neue FILESTREAM-Feld Document_Filestream
übertragen und die eingebetteten Dokumente ausgelagert werden können, müssen die Felder miteinander abgeglichen werden. Öffnen Sie dazu im SQL Server Management Studio
eine neue Abfrage und geben die folgenden Zeilen ein:
UPDATE Activities
SET Document_Filestream = Document_Embedded
Führen Sie die Abfrage anschließend über Ausführen
für die Datenbank combit_Large??
aus.
Löschen und anschließendes Umbenennen des BLOB-Felds
Damit später in der combit CRM-Solution keine Anpassungen durchgeführt werden müssen, empfiehlt es sich das nun nicht mehr benötigte BLOB-Feld Document_Embedded
zu löschen. Öffnen Sie dazu im SQL Server Management Studio
eine neue Abfrage und geben die folgenden Zeilen ein:
ALTER Table Activities
DROP Column Document_Embedded
Führen Sie die Abfrage anschließend über Ausführen
für die Datenbank combit_Large??
aus.
Da in der combit CRM-Solution das Feld für die eingebetteten Dateien noch immer den Namen des gelöschten BLOB-Felds Document_Embedded
trägt, empfiehlt es sich das neue FILESTREAM-Feld Document_Filestream
mit ebendiesem Namen zu versehen. Öffnen Sie dazu im SQL Server Management Studio
eine neue Abfrage und geben die folgenden Zeilen ein:
EXEC sp_rename 'Activities.Document_Filestream', 'Document_Embedded', 'COLUMN';
Führen Sie die Abfrage anschließend über Ausführen
für die Datenbank combit_Large??
aus.
Freigabe des belegten Speicherplatzes
Um den durch die ehemals eingebetteten Dokumente belegten Speicherplatz in der SQL-Datenbank wieder freizugeben, öffnen Sie im SQL Server Management Studio
eine neue Abfrage und geben die folgenden Zeilen ein:
DBCC CLEANTABLE (combit_Large??, 'Activities', 0)
GO
Führen Sie die Abfrage anschließend über Ausführen
aus.
Im Anschluss muss auch die entsprechende Datendatei der Datenbank selbst reduziert werden. Öffnen Sie dazu im SQL Server Management Studio
eine neue Abfrage und geben die folgenden Zeilen ein:
DBCC SHRINKFILE (combit_Large??);
GO
Führen Sie die Abfrage anschließend über Ausführen
aus.
Hinweis: Bitte beachten Sie, dass dieser Vorgang, je nach Größe des belegten Speicherplatzes, entsprechend Zeit in Anspruch nehmen kann.