Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

Microsoft SQL Server FileStream

5. Mai 2010 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

SQL FileStream zum effektiven Speichern von BLOBs = Binary Large Objects ist im Microsoft SQL Server ab Version 2008 neu hinzugekommen. Es kombinierte die Vorteile der Ablage im SQL Server als VarBinary Daten mit der Möglichkeit der transaktionellen Verarbeitung und der Ablage im File-System mit der performanten Zugriffsmöglichkeit über Windows Streaming / API Zugriff.

 

Es gibt ein wirklich sehr gutes und umfangreiches Whitepaper „FILESTREAM Storage in SQL Server 2008“ im MSDN Bereich von Paul S. Randall, das alle Aspekte rund um FileStream beleuchtet. Was soll ich dem hinzufügen?

 

Ich habe nun auch mal etwas experimentiert und ein paar erste Erfahrungen gesammelt:

·         Mein erster Test war unter Windows XP mit MS SQL Server 2008 Express Edition ohne SP, der unter dem Account „NetworkServices“ lief. Die Anlage der Dateigruppe für FileStream schlug mit einer nicht gerade aussagekräftigen Fehlermeldung fehl wie
Unable to open the physical file "c:\Program Files\Microsoft SQL Server\...". Operating system error -2147024891: "0x80070005(Access is denied.)"
 Eine kurze Recherche ergab, dass der Dienst unter einem Windows Account laufen muss, damit es funktioniert. Einen entsprechenden Eintrag gibt es bereits bei MS Connect. Mit meiner Developer Edition unter Windows Vista mit Dienstkonto „Local System“ hingegen funktionierte es ohne Änderungen.

·         Änderungen an FileStream Daten, also UPDATE und DELETE, werden nicht direkt im Transaktionsprotokoll protokolliert, sondern in Form von revisionierten Dateien. Diese verbleiben im Dateisystem bis zur nächsten Voll- bzw. Log-Sicherung; das muss man bei der Planung des Speicherplatzes beachten.

 

 USE [master] 
 GO 
 EXEC sp_configure filestream_access_level, 2; 
 GO 
 RECONFIGURE; 
 GO 
   
 ALTER database AdventureWorks 
 ADD FILEGROUP [FileStreamFG] 
 CONTAINS FILESTREAM 
 GO 
   
 ALTER database AdventureWorks 
 ADD FILE 
 ( 
  NAME= 'FileStream', 
  FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL10DEV\FG' 
 ) 
 TO FILEGROUP [FileStreamFG] 
 GO 
   
 USE [AdventureWorks] 
 GO 
   
 CREATE TABLE dbo.FileStreamStorage 
  ( 
  [Id] int NOT NULL IDENTITY(1, 1) PRIMARY KEY, 
  [Guid] uniqueidentifier NOT NULL UNIQUE ROWGUIDCOL DEFAULT NEWID(), 
  [FileName] varchar(255) NOT NULL, 
  [FileStreamData] varbinary(MAX) FILESTREAM NULL  
  ) ON [PRIMARY] 
  FILESTREAM_ON [FileStreamFG] 
 GO 
   
 INSERT INTO dbo.FileStreamStorage ([FileName], [FileStreamData]) 
 VALUES ('Test1.txt', CONVERT(varbinary(max), N'Hello World')); 
   
 INSERT INTO dbo.FileStreamStorage ([FileName], [FileStreamData]) 
 VALUES ('Test2.txt', CONVERT(varbinary(max), N'Hello World again')); 
   
 INSERT INTO dbo.FileStreamStorage ([FileName], [FileStreamData]) 
 VALUES ('Test3.txt', CONVERT(varbinary(max), N'Hello World again')); 
   
 INSERT INTO dbo.FileStreamStorage ([FileName], [FileStreamData]) 
 VALUES ('Test4.txt', CONVERT(varbinary(max), 'Hello World again')); 
 GO 
   
 DELETE FROM dbo.FileStreamStorage 
 WHERE [Id] <= 4; 

Diesen Post teilen

Repost 0

Kommentiere diesen Post

Albert K 08/26/2010 18:54


du bist sehr fachkundig!Das kann man selten heutzutage finden. Danke für die Lektüre!


Teodor 05/22/2010 12:40


Danke für den Tipp, genau danach hab ich gesucht!!


Olaf Helper 05/23/2010 10:39



Gern geschehen.