FileStream w SQL Server 2008, cz. 1/2 Udostępnij na: Facebook

Autor: Wojciech Kalbarczyk

Opublikowano: 2010-11-05

BLOB (Binary Large Object) jest binarnym typem danych, który pozwala zapisywać duże ilości danych jako jeden obiekt. Służy on do przechowywania danych o niezorganizowanej strukturze, takich jak dokumenty tekstowe, zdjęcia czy filmy. W wersji SQL Server z 2008 roku dodano ciekawy mechanizm do przechowywania danych typu BLOB – FILESTREAM.

            W poprzednich wersjach serwera duże pliki binarne mogliśmy przechowywać na dwa sposoby: w tablicy wewnątrz bazy danych lub poza serwerem (wówczas w tablicy umieszczona była tylko ścieżka do pliku). Wiązało się to jednak z pewnymi niedogodnościami. Przy umieszczaniu danych wewnątrz serwera pojawiał się problem z plikami większymi niż 2GB oraz z bardzo wolnym czasem odczytu danych. Natomiast umieszczając pliki poza serwerem, traciliśmy kontrolę nad dostępem do plików, co mogło spowodować utratę danych. Problemy te rozwiązało dopiero wprowadzenie w SQL Server 2008 mechanizmu FILESTREAM. Pozwala on na zapis plików większych niż 2GB w formacie NTFS (varbinary(max) z atrybutem FILESTREAM), przy czym dostęp do tych danych jest taki sam, jak w przypadku zwykłej tabeli. Oczywiście możemy dane typu BLOB przechowywać jak w poprzednich wersjach serwera, czyli korzystając z typu varbinary(max), jednak musimy pamiętać o wspomnianych problemach.

            Opcja FILESTREAM jest domyślnie wyłączona, i włączenie jej było możliwe podczas instalacji SQL Servera. Jeżeli tego nie zrobiliśmy, musimy to zrobić samodzielnie. Mamy do wyboru dwie opcje:

1. Wykorzystujemy procedurę sp_configure:

            EXEC sp_configure 'filestream_access_level', 'level'

                RECONFIGURE

            gdzie level to poziom określający dostęp do plików:

            0 – zablokowane – wartość domyślna

            1 – dostęp tylko poprzez T-SQL

            2 – dostęp zarówno przez T-SQL, jak i system plików.

2. Uruchamiamy SQL Server Configuration Manager, wybieramy z listy po lewej stronie SQL Server Services, z menu kontekstowego dla SQL Server wybieramy Properties, a następnie przechodzimy do zakładki FILESTREAM.

Obraz 1. SQL Server Configuration Manager – FILESTREAM.

Aby upewnić się, czy FILESTREAM został włączony, możemy wykonać następujące polecenie:

SELECT

 SERVERPROPERTY ('FilestreamShareName') AS ShareName

,SERVERPROPERTY ('FilestreamConfiguredLevel') AS ConfiguredLevel

,SERVERPROPERTY ('FilestreamEffectiveLevel') AS EffectiveLevel

gdzie ShareName to nazwa zasobu sieciowego, ConfiguredLevel to skonfigurowany poziom dostępu, a EffectiveLevel – aktualny poziom dostępu.


Obraz 2. Stan FILESTREAM

Innym sposobem na sprawdzenie ustawień FILESTREAM jest wywołanie procedury:

EXEC sp_configure filestream_access_level ,


Obraz 3. sp_configure filestream_access_level.

lub wywołanie komendy net share w wierszu poleceń. Wyświetla ona wszystkie udostępnione zasoby na danym komputerze, m.in. te otrzymane z FILESTREAM.


Obraz 4. NET SHARE

Spróbujmy więc stworzyć bazę danych korzystającą z FILESTREAM. Musimy pamiętać, aby utworzyć również grupę plików, która będzie kontenerem dla plików typu FILESTREAM.

CREATE DATABASE DB_FILESTREAM ON PRIMARY

  ( NAME = DB_FILESTREAM,

    FILENAME = N'C:\filestream\DB_FILESTREAM.mdf',

    SIZE = 3072KB,

    MAXSIZE = UNLIMITED),

FILEGROUP GR_FILESTREAM CONTAINS FILESTREAM

  ( NAME = GR_FILESTREAM_CAT,

    FILENAME = N'C:\filestream\GR_FILESTREAM_CAT')

LOG ON

  ( NAME = 'DB_FILESTREAM_log',

    FILENAME = N'C:\filestream\DB_FILESTREAM_log.ldf',

    SIZE = 1024KB,

    MAXSIZE = 2048KB,

    FILEGROWTH = 10%);

W bazie tej możemy utworzyć tablice, które będą korzystały z mechanizmu FILESTREAM. Musimy tylko pamiętać o tym, że jedna z kolumn musi być typu UNIQUEIDENTIFIER z dodatkowym atrybutem ROWGUIDCOL. Oczywiście w tabeli musi być również kolumna typu varbinary(max) z atrybutem FILESTREAM. Poniżej przedstawiam przykładową tabelę:

CREATE TABLE dbo.Obraz

(

                id_Obraz UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,

                obrazek varbinary(max) FILESTREAM

);

Dostęp do danych w tabeli z FILESTREAM możliwy jest poprzez Transact-SQL oraz API OpenSqlFilestream. Korzystając z T-SQL, możemy:

- dodawać nowe wiersze

INSERT INTO dbo.Obraz

VALUES( NEWID(),NULL);  -- w tym przypadku nie utworzony zostanie nowy plik

Obraz 5. Dodawanie wiersza – 1.

INSERT INTO dbo.Obraz

VALUES( NEWID(), CAST('' AS varbinary(max) )); -- utworzony zostanie plik pusty

Obraz 6. Dodawanie wiersza – 2.

Obraz 7. Utworzony plik.

INSERT INTO dbo.Obraz

VALUES( NEWID(), CAST('tekst' AS varbinary(max) ))  --'tekst' , a więc ciąg znaków tekstowych  zostanie zamieniony na postać binarną do formatu varbinary(max)

Obraz 8. Dodawanie wiersza – 3.

Obraz 9. Utworzone pliki

- aktualizować wiersze

 UPDATE dbo.Obraz

SET id_Obraz = NEWID()

WHERE obrazek='tekst'

Obraz 10. Aktualizacja wiersza

- usuwać wiersze

DELETE FROM dbo.Obraz

WHERE obrazek=''

Obraz 11. Usuwanie wiersza