Microsoft SQL Server 2008

SQL Server 2008 – FILESTREAM, czyli przechowywanie dużych obiektów binarnych (BLOB) w systemie plików Udostępnij na: Facebook

Autor: Damian Widera

Opublikowano: 17 stycznia 2008

Zawartość strony
 Wstęp   Wstęp
 Podstawowe informacje o FILESTREAM   Podstawowe informacje o FILESTREAM
 Konfiguracja serwera baz danych do obsługi FILESTREAM   Konfiguracja serwera baz danych do obsługi FILESTREAM
 Tworzenie bazy danych korzystającej z kontenera FILESTREAM   Tworzenie bazy danych korzystającej z kontenera FILESTREAM
 Tworzenie tablicy zawierającej kolumnę FILESTREAM   Tworzenie tablicy zawierającej kolumnę FILESTREAM
 Operacje DML na tablicy zawierającej kolumny FILESTREAM   Operacje DML na tablicy zawierającej kolumny FILESTREAM
 FILESTREAM a bezpieczeństwo danych   FILESTREAM a bezpieczeństwo danych
 Użycie kontenera FILESTREAM w aplikacji klienckiej   Użycie kontenera FILESTREAM w aplikacji klienckiej
 FILESTREAM a inne funkcje SQL Server   FILESTREAM a inne funkcje SQL Server
 Podsumowanie   Podsumowanie

Wstęp

SQL Server 2008 wprowadzi kolejną nowość – FILESTREAM – co pozwoli aplikacjom, opartym na tym serwerze baz danych, na przechowywanie danych niezorganizowanych (unstructured), takich, jak dokumenty oraz zdjęcia w systemie plików NTFS. Aplikacja z jednej strony będzie mogła wykorzystać zalety API Windows do odczytu pliku oraz zarządzać spójnością pomiędzy danymi niezorganizowanymi a danymi o określonej strukturze (zdefiniowanymi, np. tablice).

 Do początku strony Do początku strony

Podstawowe informacje o FILESTREAM

Znaczna część danych tworzonych obecnie, takich, jak: dokumenty, zdjęcia, pliki wideo, z punktu widzenia serwera baz danych, ma niezorganizowaną strukturę. Dane tego typu przechowywane są zwykle poza serwerem baz danych, a to z kolei powoduje konieczność odpowiedniego zarządzania takimi obiektami. Nie ma w zasadzie żadnej możliwości na poziomie bazy danych kontrolowania dostępu do tych plików. Użytkownik może więc dowolnie zmieniać ich zawartość, a w najgorszym przypadku usunąć je.

Kolejnym problemem jest wykonywanie kopii zapasowej bazy danych i odtwarzanie jej na innym serwerze – należałoby wtedy pamiętać o przeniesieniu plików na drugi serwer oraz utworzeniu odpowiednich do nich ścieżek, co nie zawsze jest możliwe. Pozostaje jeszcze do rozwiązania problem związany z równoczesnym dostępem wielu użytkowników do tego typu zasobu.

Mając to na uwadze, można zmienić strategię i niezorganizowane obiekty mogą być również przechowywane wewnątrz bazy danych. Rozwiązanie takie nie jest jednak optymalne. Istnieje chociażby ograniczenie wielkości takiego dokumentu, które obecnie wynosi 2GB.

Użycie FILESTREAM rozwiązuje wszystkie wspomniane powyżej problemy. Zacznijmy jednak od początku i przeanalizujmy, co niesie ze sobą użycie FILESTREAM.

W silniku baz danych SQL Server 2008 duże obiekty binarne mogą być przechowywane w tradycyjny sposób, jako dane typu varbinary(max) lub obiekty typu varbinary(max) FILESTREAM, co spowoduje zapisanie ich w systemie plików NTFS. Tradycyjne przechowywanie obiektów w kolumnie varbinary(max) niesie ze sobą ograniczenie na wielkość obiektu. W przypadku przechowania obiektu w systemie plików jedynym ograniczeniem na jego wielkość jest ilość dostępnego miejsca na dysku twardym.

Można wiec rozważyć wybór architektury pomiędzy tymi dwoma możliwościami. Generalnie, o użyciu FILESTREAM decyduje ilość danych, które należy przechować oraz sposób, w jaki będą używane. FILESTREAM powinien być zatem użyty w trzech przypadkach, gdy:

  1. przechowywany obiekt ma (średnio) powyżej 1MB;
  2. istotny jest szybki odczyt danych;
  3. środkowa warstwa aplikacji klienckiej, a więc warstwa logiki aplikacji w modelu trójwarstwowym, korzysta z dużych obiektów binarnych .

Dla mniejszych obiektów przechowywanie ich w bazie danych w większości przypadków poprawia wydajność ich odczytu.

 Do początku strony Do początku strony

Konfiguracja serwera baz danych do obsługi FILESTREAM

Konfiguracja obsługi FILESTREAM sprowadza się do włączenia tej opcji dla instancji serwera baz danych. Można to zrobić na dwa sposoby:

  1. uruchamiając procedurę składowaną sp_filestream_configure;
  2. przy pomocy SQL Server Management Studio (SSMS), używając zakładki Advanced w oknie dialogowym właściwości serwera (rys. 1).

Rys. 1. Konfiguracja serwera baz danych do obsługi FILESTREAM.

Procedura sp_filestream_configure ma następującą składnię:

sp_filestream_configure [ [ @enable_level = ] level ] 

    [ [ , @share_name = ] 'share_name' ] ;

gdzie:

**@enable\_level** - określa poziom dostępu do danych przechowywanych w systemie plików NTSF. Zbiór możliwych wartości parametru **@enable\_level** wraz z ich opisem zebrano w tabeli poniżej.

Wartość parametru Opis
0 Brak dostępu (wartość domyślna)
1 Dostęp tylko z poziomu kodu T-SQL
2 Dostęp tylko z poziomu kodu T-SQL oraz z lokalnego systemu plików
3 Dostęp z poziomu kodu T-SQL, lokalnego oraz zdalnego systemu plików

Drugi parametr, **@share\_name**, określa nazwę zasobu, poprzez którą będzie możliwy dostęp do danych FIESTREAM. Wartość paramateru **@share\_name** może zostać podana w przypadku zmiany parametru **@enable\_level** z 0 lub 1 na 2 lub 3. Czyli najpierw trzeba uruchomić procedurę sp_filestream_configure z parametrem **@enable\_level** , który ma wartość 0 lub 1 a następnie uruchomić ją jeszcze raz z parametrem **@enable\_level** , który ma wartość 2 lub 3, podając równocześnie wartość parametru **@share\_name**. W przypadku, gdy wartość parametru @share\_name nie zostanie określona, to nazwa instancji SQL Server zostanie przyjęta jako wartość domyślna. Parametr **@share\_name** jest typu sysname.

Procedura składowana sp_filestream_configure zwraca 0 w przypadku pomyślnie zakończonej operacji włączenia FILESTREAM w instancji serwera baz danych.

Użytkownik może wykonać procedurę, o ile należy do serwerowej roli sysadmin oraz ma uprawnienia lokalnego administratora systemu Windows na serwerze.

EXEC sp_filestream_configure 2 ,'FilestreamInstance'

Uruchomienie powyższej procedury spowoduje, iż dostępny będzie zasób sieciowy o nazwie FIlestreamInstance (patrz rys. 2.).

Rys. 2. Informacja zasobie przeznaczonym na FILESTREAM.

Informacje o konfiguracji FILESTREAM można uzyskać, wykonując zapytanie:

SELECT SERVERPROPERTY ('FilestreamShareName')

      ,SERVERPROPERTY ('FilestreamConfiguredLevel')

      ,SERVERPROPERTY ('FilestreamEffectiveLevel')

Własność FilestreamShareName przechowuje informacje o nazwie zasobu sieciowego. FilestreamConfiguredLevel informuje, w jaki sposób skonfigurowano dostęp do FILESTREAM. Ostatnia interesująca własność – FilestreamEffectiveLevel – określa, jaki jest efektywny dostęp do FILESTREAM. Wartości te mogą być różne w sytuacji, kiedy wymagany jest restart instancji serwera baz danych lub całego serwera. W takiej sytuacji można uruchomić procedurę sp_filestream_configure bez parametrów, a w wyniku wykonania tej procedury zwrócona zostanie informacja o przyczynach występującej różnicy.

Uwaga! Po uruchomieniu procedury składowanej sp_filestream_configure może zaistnieć konieczność ponownego uruchomienia instancji SQL Server lub całego serwera (np. dla systemu operacyjnego Windows Server 2003). Jest to wymagane tylko podczas pierwszej konfiguracji FILESTREAM lub w przypadku zainstalowania lub uaktualnienia sterownika RsFx. Restart instancji SQL Server jest wymagany, gdy FILESTREAM zostaje wyłączony po tym, jak wcześniej był dostępny.

 Do początku strony Do początku strony

Tworzenie bazy danych korzystającej z kontenera FILESTREAM

Po uruchomieniu FILESTREAM w instancji SQL Server, można przystąpić do utworzenia bazy danych oraz tablic przechowujących dane korzystające z FILESTREAM.

Baza danych, która korzysta z mechanizmu FILESTREAM, musi posiadać co najmniej jedną grupę plików, dla której zostanie określona klauzula CONTAINS FILESTREAM:

use master

GO



CREATE DATABASE BazaDaychFileStream ON PRIMARY

  ( NAME = BazaDaychFileStream_data, 

    FILENAME = N'D:\TECHNET\BazaDaychFileStream_data.mdf',

    SIZE = 10MB,

    MAXSIZE = 50MB),

FILEGROUP GrupaFileStream CONTAINS FILESTREAM

  ( NAME = KatalogFileStream, 

    FILENAME = N'D:\TECHNET\FileStreamCatalog')

LOG ON 

  ( NAME = 'BazaDaychFileStream_log', 

    FILENAME = N'D:\TECHNET\BazaDaychFileStream_log.ldf',

    SIZE = 5MB, 

    MAXSIZE = 25MB, 

    FILEGROWTH = 5MB);

Dla grupy plików FILESTREAM atrybut FILENAME wskazuje miejsce, w którym będą przechowywane pliki. Należy jednak być czujnym, ponieważ ścieżka powyżej ostatniego folderu musi istnieć (D:\Technet), a ostatni folder (FileStreamKatalog) nie może z kolei istnieć w momencie tworzenia bazy danych. Systemowe katalogi, w których będą istniały dane FILESTREAM nazwane zostały kontenerami danych.

Po utworzeniu bazy danych SQL Server utworzy także katalog FileStreamCatalog, w którym znajdzie się plik filestream.hdr oraz katalog $FSLOG.

Uwaga

Plik filestream.hdr jest ważnym plikiem systemowym i nie powinno się go otwierać i modyfikować.

W przypadku istniejącej bazy danych, należy użyć polecenia ALTER DATABASE i dodać nową grupę plików z klauzulą CONTAINS FILESTREAM.

Grupy plików zawierające FILESTREAM mogą być zachowywane jako kopie zapasowe (backup), ale również mogą być z tego procesu wyłączone. W takim przypadku należałoby wykonać częściowe zachowywanie bazy danych bez grupy plików FILESTREAM.

Kończąc rozważania o bazie danych i FILESTREAM, należy zapamiętać, iż:

  1. kontenery FILESTREAM nie mogą być zagnieżdżone;
  2. grupy plików FILESTREAM mogą być umieszczane na skompresowanych woluminach.

 Do początku strony Do początku strony

Tworzenie tablicy zawierającej kolumnę FILESTREAM

Baza danych, która posiada grupę plików zawierającą FILESTREAM, może posiadać tablice, które będą korzystały z nowej funkcjonalności.

Każda z tablic specyfikuje, iż dana kolumna zawiera dane typu FILESTREAM poprzez utworzenie typu varbinary(max) z atrybutem FILESTREAM. Drugim warunkiem jest, aby ta tablica zawierała kolumnę RUWGUIDCOL, co pozwala jednoznacznie identyfikować wiersze.

USE BazaDaychFileStream;

GO

IF OBJECT_ID('dbo.autorzy', 'U') IS NOT NULL

  DROP TABLE dbo.autorzy

GO

CREATE TABLE dbo.autorzy

(

    id UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE, 

    Imie varchar(25),

    Nazwisko varchar(25),

    Bio varbinary(max) FILESTREAM

);

GO

 Do początku strony Do początku strony

Operacje DML na tablicy zawierającej kolumny FILESTREAM

Po przygotowaniu tablicy do przechowywania dużych obiektów binarnych w systemie plików, można użyć języka DML do wstawiania, modyfikacji lub usuwania danych. W przypadku wykonywania operacji INSERT do kolumny FILESTREAM można wstawić wartość NULL bądź varbinary(MAX). W pierwszym przypadku w systemie plików nie zostanie utworzony nowy plik.

INSERT INTO dbo.autorzy 

VALUES(NEWID(),'Adam','Mickiewicz',NULL)

Można również wstawić łańcuch o zerowej długości, co jest przydatne do uzyskania uchwytu do pliku z poziomu aplikacji klienckiej, używając Win32 API, o czym będzie mowa w dalszej części artykułu.

INSERT INTO dbo.autorzy 

VALUES(NEWID(),'Juliusz','Slowacki',CAST('' as varbinary(max)))

Ostatni przykład pokazuje, w jaki sposób stworzyć plik z danymi. Silnik bazy danych zamienia podany łańcuch tekstowy na typ varbinary(max), tworzy plik (o ile jest potrzebny) i wstawia do niego dane.

INSERT INTO dbo.autorzy 

VALUES(NEWID(),'Jan','Kochanowski',CAST('tutaj moze byc zdjecie poety lub jego wiersze' as varbinary(max)))

Kolumna zawierająca dane przechowywane w systemie plików może być aktualizowana poleceniem UPDATE. Należy jednak pamiętać, iż nie jest to wskazana operacja w przypadku dużego ilości danych.

UPDATE dbo.autorzy

SET Bio = CAST('biografia wieszcza' as varbinary(max))

WHERE Nazwisko = 'Mickiewicz'

Usuwanie wiersza z tablicy powoduje również usunięcie pliku. Jest to również jedyny sposób umożliwiający usunięcie pliku, do którego dostęp jest kontrolowany przez serwer baz danych.

DELETE FROM dbo.autorzy

WHERE Nazwisko = 'Slowacki'

Przy pobieraniu danych z kolumny FILESTREAM należy pamiętać, iż trzeba za każdym razem pobrać kolumnę posiadającą atrybut ROWGUIDCOL, co pozwala na deterministyczne zidentyfikowanie każdego wiersza, jak pokazano na przykładzie poniżej.

SELECT Nazwisko, Bio, id

FROM dbo.autorzy

Poniższy przykład pobrania danych zakończy się niepowodzeniem, ponieważ w zapytaniu nie ma kolumny ID, która zawiera atrybut ROWGUIDCOL.

SELECT Nazwisko, Bio

FROM dbo.autorzy

Zbiór wielu przykładów zapytań znaleźć można w Books Online.

 Do początku strony Do początku strony

FILESTREAM a bezpieczeństwo danych

W SQL Server 2008 dostęp do danych typu FILESTREAM jest zabezpieczony tak, jak do każdych innych danych. Istnieje możliwość nadania użytkownikowi odpowiednich uprawnień na poziomie dostępu do tabeli czy kolumny. Gdy użytkownik uzyskał dostęp na poziomie tabeli, to może otwierać pliki zachowane w kolumnie FILESTREAM.

SQL Server 2008 ogranicza dostęp do plików także dla użytkowników systemu operacyjnego. Tylko konto, na którym uruchomiony został serwis SQL Server ma nadane prawa NTFS do kontenera danych. Rekomendacja firmy Microsoft określa, iż uprawnienia te nie powinny być transferowane na innych użytkowników czy konta.

Dostęp do danych FILESTREAM, dla bazy danych będącej w trybie online, jest możliwy tylko z poziomu transakcji T-SQL lub API OpenSqlFilestream. W sytuacji, gdy baza danych zostaje zamknięta, to katalog zawierający dane FILESTREAM przestaje być kontrolowany w sposób omówiony powyżej. Z tego powodu kontener danych powinien być dodatkowo zabezpieczony tak, aby nie była możliwa przypadkowa ingerencja użytkownika, co mogłoby ponieść za sobą problem utraty danych.

Uwaga! Nie jest możliwe użycie kryptowania dla danych FILESTREAM.

 Do początku strony Do początku strony

Użycie kontenera FILESTREAM w aplikacji klienckiej

Aplikacje klienckie mogą używać Win32 API do uzyskania dostępu do dużych danych binarnych, które są przechowywane w systemie plików NTFS. SQL Server 2008 umożliwia uzyskanie dostępu do danych FILESTREAM za pomocą dwóch funkcji oraz API:

  1. PathName zwraca ścieżkę dostępu jako token do obiektu, który jest użyty w aplikacji do uzyskania uchwytu (Win32 handle) do obiektu BLOB i wykonywania operacji na tym obiekcie. W dalszej części artykułu zostanie dokładniej omówione działanie funkcji PathName;

  2. GET_FILESTREAM_TRANSACTION_CONTEXT() zwraca token, który reprezentuje aktualną transakcję w sesji. Aplikacja może użyć tego tokena do powiązania operacji strumieniowych wykonywanych na obiekcie BLOB z transakcją. W przypadku, gdy nie ma aktywnej transakcji, to funkcja GET_FILESTREAM_TRANSACTION_CONTEXT() zwraca wartość NULL;

  3. API OpenSqlFilestream pozwala uzyskać uchwyt do pliku Win32, który może być przekazany do takich funkcji, jak:

    1. ReadFile
    2. WriteFile
    3. TransmitFile
    4. SetFilePointer
    5. SetEndOfFile
    6. FlushFileBuffers

W przypadku, gdy aplikacja użyje odwołań do innego API i przekaże do nich uzyskany wcześniej uchwyt, to otrzyma błąd ERROR_ACCESS_DENIED.

Uwaga! Aplikacja powinna zamknąć uchwyt za pomocą funkcji CloseHandle.

Dostęp do kontenera danych FILESTREAM jest możliwy tylko i wyłącznie w ramach transakcji SQL Server. W ramach aktywnej transakcji można wykonywać kod T-SQL, który pomoże zarządzać spójnością pomiędzy danymi przechowanymi w aparacie SQL a danymi zawartymi w kontenerze FILESTREAM.

Praktyczne przykłady ilustrujące możliwości pracy z FILESTREAM z punktu widzenia aplikacji klienckiej oraz serwera baz danych można znaleźć na stronach Microsoft SQL Server Samples and Community Projects.

Pozostaje do omówienia jedna z ciekawszych funkcji, PathName, która jak wspomniałem powyżej, służy do uzyskania ścieżki dostępu jako tokena do obiektu FILESTREAM. Token jest w następnym kroku używany przez aplikację kliencką do uzyskania uchwytu Win32 i operowania na danych BLOB za pomocą API systemu Windows. Użycie funkcji PathName jest bardzo proste i polega na wywołaniu następującej składni:

[nazwa_kolumny].PathName()

Kolumna, na której operować będzie funkcja PathName musi być typu varbinary(max) z atrybutem FILESTREAM. Próba wykonania funkcji PathName na kolumnie innego typu niż varbinary(max) spowoduje wystapienie błędu kompilacji składni. Niestety, nie można używać żadnych wyrażeń, rzutowania ani konwersji wykonywanych na tej kolumnie. Funkcja PathName() zwraca ścieżkę dostępu, która może mieć więcej niż 260 znaków, do obiektu BLOB i jest to wartość tylko do odczytu lub NULL, gdy wartość w kolumnie FILESTREAM też wynosi NULL.

Ogólnie rzecz ujmując, metodologia odczytywania (za Books Online)

/* 1) Rozpoczęcie transakcji. */

BEGIN TRANSACTION



/* 2) Odnalezienie ścieżki dostępu do pliku. */

DECLARE @PathName nvarchar(max);

SET @PathName = (

    SELECT Photo.PathName()

    FROM dbo.Customer

    WHERE CustomerID = 102

    );



/* 3) Uzyskanie kontekstu transakcji (tokena). */

DECLARE @TransactionToken varbinary(max);

SET @TransactionToken = SELECT GET_FILESTREAM_TRANSACTION_CONTEXT ();



/* 4) Aplikacja kliencka używa  API OpenSqlFilestream API do uzyskania uchwytu do pliku Win32.*/



/* 5)  Aplikacja może wywoływac funkcje ReadFile(), WriteFile(), TransitFile(), SetFilePointer(), SetEndofFile() or FlushFileBuffers(). */



/* 6) Po zakończeniu operacji na pliku nalezy zamknąć uchwyt do tego pliku za pomocą funkcji CloseHandle(). */





/* 8) Należy zatwierdzić lub wycofać transakcję. */

COMMIT TRANSACTION

 Do początku strony Do początku strony

FILESTREAM a inne funkcje SQL Server

W poprzednim punkcie przedstawiłem podstawowe informacje o FILESTREAM. Nadszedł czas, aby sprawdzić, w jaki sposób użycie nowej funkcjonalności wpływa na te już istniejące, które są dostępne w SQL Server 2008:

  1. Migawkę bazy danych (Database Snapshot);
  2. Replikację;
  3. Log Shipping;
  4. Database Mirroring;
  5. Full-Text;
  6. Failover Clustering.

Migawka bazy danych

SQL Server 2008 nie daje możliwości wykonania migawki bazy danych dla grupy plików zawierającej atrybut FILESTREAM. W przypadku, gdy w klauzuli CREATE DATABASE ON będzie zawarta grupa plików FILESTREAM, to system zgłosi błąd. Migawka bazy danych może być wykonana z wszystkich pozostałych grup plików, tak, jak ma to miejsce do tej pory, a grupa zawierająca FILESTREAM zostanie oznaczona jako offline dla takiej migawki. Zapytanie SELECT… wykonane na migawce bazy danych nie może zawierać kolumny, której dane przechowywane są w systemie plików. W przeciwnym przypadku wygenerowany zostanie błąd:

‘Could not continue scan with NOLOCK due to data movement.’

Replikacja

Kolumna varbinary(max) zawierająca atrybut FILESTREAM, która została włączona do replikacji po stronie publikatora (Publisher), może zostać zreplikowana do odbiorców (Subscribers) z lub bez atrybutu FILESTREAM. Zostaje to określone w parametrze **@schema\_option** procedury składowanej sp_addarticle lub sp_addmergearticle. W przypadku, gdy atrybut FILESTREAM nie podlega replikacji, należy pamiętać o 2GB ograniczeniu wynikającym z typu danych varbinary(max), ponieważ próba zreplikowania większej ilości danych spowoduje błąd. Z tego powodu rekomenduje się replikowanie atrybutu FILESTREAM, chyba że dane replikowane są na SQL Server 2005. Dla SQL Server 2000 nie można w ogóle replikować tabel zawierających kolumny z atrybutem FILESTREAM, niezależnie od konfiguracji parametru **@schema\_option**.

Dla replikacji transakcyjnej należy mieć w pamięci, iż:

  1. W przypadku, gdy tabela zawiera kolumny z atrybutem FILESTREAM, nie można używać wartości snapshot lub database snapshot character dla parametru **@sync\_method** procedury składowanej sp_addpublication.
  2. Opcja max text repl size określa maksymalną ilość danych, jakie mogą być przechowane w kolumnie, która jest publikowana w replikacji. Ta opcja może być użyta do kontrolowania rozmiaru danych w kolumnach, które mają atrybut FILESTREAM.
  3. Po określeniu parametru **@schema\_option** tak, aby replikował się atrybut FILESTREAM, należy także włączyć do replikacji kolumnę z typem uniqueidentifier, którą FILESTREAM potrzebuje do identyfikacji każdego wiersza. W tym miejscu przypominam, iż kolumna ta musi mieć również zdefiniowane ograniczenie UNIQUE, które także musi być replikowane. W przeciwnym przypadku proces replikacji nie będzie brał pod uwagę atrybutu FILESTREAM.

Podczas replikacji scalającej (merge replication) należy pamiętać, iż:

  1. Replikacja scalająca oraz FILESTREAM wymagają istnienia kolumny typu uniqueidentifier, która ma trybut ROWGUIDCOL i domyślną wartość NEWID() lub NEWSEQUENTIALID(). Ze względu na kwestie związane z wydajnością procesu replikacji rekomenduje się użycie NEWSEQUENTIALID().

    Replikacja merge automatycznie dodaje taką kolumnę, jeżeli tablica jej nie posiada. FILESTREAM wymaga natomiast, aby ta kolumna posiadała jeszcze zdefiniowane ograniczenie UNIQUE. W przypadku, gdy tablica jest już publikowana w replikacji, a ograniczenie UNIQUE nie zostało zdefiniowane, to należy je dodać ręcznie. Ta akcja niesie jednak pewne potencjalne niebezpieczeństwo podczas usuwania replikacji. Należy wtedy pamiętać, iż ograniczenie UNIQUE dodane ręcznie musi zostać usunięte zanim zostanie usunięta replikacja, w przeciwnym przypadku serwer zgłosi błąd

  2. Replikacja scalająca oferuje pewną optymalizację dla dużych obiektów. Optymalizacja jest kontrolowana przez parametr **@stream\_blob\_columns** procedury sp_addmergearticle. Wartość tego parametru może być zmieniona, wywołując procedurę składowaną sp_changemergearticle, tzn. parametr **@stream\_blob\_columns** będzie miał wartość false. Rekomenduje się pozostawienie wartości omawianego parametru na true dla kolumn z atrybutami FILESTREAM podczas replikacji merge, co spowoduje, iż optymalizacja będzie włączona.

  3. Po utworzeniu artykułu zmiana opcji schematu dla FILESTREAM spowoduje wystąpienie błędu, jeżeli ilość danych w kolumnie FILESTREAM przekroczy 2GB i nastąpi konflikt podczas replikacji. W takim przypadku rekomenduje się usunięcie i ponowne utworzenie artykułu z danej tablicy z odpowiednią opcją, włączoną dla obsługi FILESTREAM, która musi być ustawiona w momencie tworzenia artykułu.

  4. Replikacja scalająca synchronizuje dane FILESTREAM poprzez HTTPS Web Synchronization. Z tego powodu, przekroczenie limitu 50 MB podczas replikacji spowoduje błąd.

Log Shipping

Funkcjonalność Log Shipping w SQL Server 2008 wspiera korzystanie z FILESTREAM. Jedynym warunkiem stawianym dla tej funkcjonalności jest, aby obydwa serwery miały zainstalowany SQL Server 2008 i na obydwu instancjach FILESTREAM był włączony.

Database Mirroring

Inaczej ma się niestety sprawa w przypadku Databse Mirroring, bowiem ta funkcjonalność nie umożliwia korzystania z FILESTREAM. Principal server nie pozwala na utworzenie grupy plików z posiadających klauzulę CONTAINS FILESTREAM. W przypadku, gdyby taka grupa plików już istaniała, to nie powiedzie się skonfigurowanie Database Mirroring.

Full Text

Indeksowanie pełnotekstowe (full-text indexing) kolumny FILESTREAM wykonywane jest w taki sam sposób, jak indeksowanie kolumny typu varbinary(max). W przypadku uaktualnienia zawartości kolumny zawierającej atrybut FILESTREAM, musi on zostać ponownie poindeksowany. W przypadku plików takich, jak obrazy (grafika) ich indeksowanie nie jest wskazane. Należy pamiętać, iż tablica taka musi zawierać kolumnę, przechowującą nazwę rozszerzenia pliku dla każdego obiektu FILESTREAM.

Failover Clustering

Dla Failover Clustering grupa plików FILESTREAM musi być umieszczona na współdzielonym (shared) dysku. Na każdym węźle w klastrze instancja SQL Server musi być skonfigurowana do obsługi FILESTREAM.

SQL Server Express 2008

Na zakończenie artykułu wspomnę, iż darmowa wersja SQL Server Express wspiera FILESTREAM, a istniejący czterogigabajtowy limit na wielkość pliku bazy danych nie dotyczy kontenera zawierającego pliki składowane w systemie plików.

 Do początku strony Do początku strony

Podsumowanie

FILESTREAM jest ciekawą alternatywą dla obecnie stosowanych rozwiązań dla przechowywania dużych obiektów binarnych (BLOB’s). Atrakcyjność użycia tego rozwiązania wynika między innymi z tego, iż zarządzanie dostępem do zewnętrznych danych odbywa się z poziomu serwera baz danych.

Dla administratorów baz danych za użyciem FILESTREAM przemawiać będzie fakt, iż współpracuje on z większością ważnych funkcjonalności, które oferuje SQL Server, w tym także może być użyty w jego darmowej wersji – SQL Server Express. Niedogodnością jest, iż Database Mirroring nie wspiera FILESTREAM.


  Damian Widera, Project Manager & Team Lead (MCT, MCITP – DBA, MCSD.NET)
Od 8 lat zajmuje się projektowaniem, tworzeniem i wdrażaniem aplikacji wykorzystujących platformę .NET, SQL Server oraz Oracle. Obecnie pracuje jako project manager dla LGBS Polska. Pracował także jako trener, programista, administrator baz danych, twórca domumentacji oraz analityk biznesowy. Aktywnie współpracuje z polskim oddziałem Microsoft publikując atykuły, webcasty oraz porady z zakresu SQL Server na stronach TechNet. Jest współautorem książki „Serwer SQL 2008. Administracja i programowanie”.

Speaker na wielu konferencjach, m.in. Microsoft Heroes Happen Here, C2C, European PASS Conference, Microsoft Technology Summit, Energy Launch, TechED. Od 2004 r. posiada certyfikaty firmy Microsoft: MCT, MCITP–DBA oraz MCSD.NET. Jest współtwórcą oraz liderem jednej z najwiekszych grup pasjonatów SQL Server w Polsce – Śląskiej Regionalnej Grupy Microsoft (PLSSUG Katowice). Od listopada 2008 jest prezesem Polish SQL Server Users Group (PLSSUG) w Polsce. W styczniu 2009 nagrodzony tytułem MVP w kategorii SQL Server.
 Do początku strony Do początku strony

Microsoft SQL Server 2008