SQL Server 2012: FileTables

FileTable to kolejny mechanizm dostępny w SQL Server mający na celu ułatwić przechowywanie dużej ilości danych np. plików. W starych bazach danych, często przechowywano pliki osobno na serwerze, a baza danych zawierała wyłącznie wskaźniki do tych plików. Podejście powodowało problemy, w przypadku synchronizacji danych tzn. plików dostępnych na dysku a ich identyfikatorami w bazie. Zwykle nie było innego wyjścia, ponieważ przechowywanie dużej ilości danych w bazach (plików graficznych) nie było zbyt optymalne.

SQL Server od dawna dysponuje już lepszymi rozwiązaniami takimi jak np. FileStream. FileTable to kolejny krok, mający na celu jeszcze bardziej ułatwić pracę z plikami w bazach. Nowy rodzaj tabeli jest kompatybilny zarówno z SQL Server jak i ze standardowym Windows API, służącym do odczytu plików. Innymi słowy, możemy modyfikować dane zarówno z poziomu SQL jak i Windows (przez Explorer). Plik taki zatem jest kompatybilny z wszystkimi innymi aplikacjami Windows i nie trzeba używać SQL aby uzyskać do niego dostęp. SQL Server zadba o synchronizacje tabeli z systemem plików Windows. Ponadto z poziomu SQL mamy inne dobrodziejstwa np. FULL-TEXT-SEARCH.

Przechodząc w SQL Management Studio do folderu Tables, zobaczymy nowy typ (File Tables):

image

FileTable jest oparty na wspomnianym FileStream więc najpierw musimy uaktywnić go w dwóch miejscach.

Pierwsze miejsce to poziom silnika bazy danych. Przechodzimy do SQL Server Configuration Manager i wybieramy z listy usług SQL Server:

image

Dwukrotnie klikamy na usłudze, przechodzimy do zakładki FileStream i aktywujemy FIleStream:

image

Kolejnym krokiem jest uruchomienie SQL Management Studio  i uaktywnienie FileStream na bazie danych. Wystarczy przejść do właściwości instancji i zakładki Advanced:

image

Stworzenie odpowiednich folderów i plików najlepiej dokonać za pomocą skryptu

alter database Test
add filegroup fsGroup contains filestream;
go

alter database Test
add file
  ( NAME = 'fsTest', FILENAME = 'c:\fsTest'
   )
to filegroup fsGroup;
go

ALTER DATABASE Test
SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'Data')

Póki co  zajmowaliśmy się wyłącznie FileStream. Musieliśmy to zrobić ponieważ FileTable bazuje na tym typie kolumny. Teraz możemy stworzyć już tabelę FileTable:

CREATE TABLE FileTableTest AS FileTable  
WITH  
(  
    FileTable_Directory = 'FileTableDirectory',  
    FileTable_Collate_Filename = database_default  
); 

W tej chwili mamy stworzoną już tabelę i możemy używać klasycznych zapytań SQL:

image

Oczywiście SELECT póki co nie zwróci żadnych danych. Z kontekstowego menu na tabeli wybierzmy “Explore FileTable Directory”. Zostaniemy przeniesieni do folderu, w którym znajdują się pliki. Stwórzmy kilka nowych plików:

image

Wykonując teraz powyższe zapytanie SELECT, rezultat będzie następujący:

image

Jak widać, system plików jest rozpoznawalny w tabeli. Spróbujmy zmienić nazwę piku z poziomu SQL:

UPDATE FileTableTest  
SET name = 'Hello World - updated.txt'  
WHERE stream_id = 'B40A2D6E-D4BC-E311-BE94-606C6688A184' 

Po wykonaniu zapytania, przechodzimy do Windows aby upewnić się, że nazwa została zmieniona:

image

Analogicznie, możemy usunąć plik:

delete from FileTableTest  
WHERE stream_id = 'B40A2D6E-D4BC-E311-BE94-606C6688A184' 

2 thoughts on “SQL Server 2012: FileTables”

  1. Piotrze,

    a jak wygląda sytuacja z obsługą FileTables przy użyciu Entity Framework? Bo gdzieś obiło mi się o oczy, że EF nie wspiera tej funkcjonalności. Jak więc to ugryźć?

    Z góry dzięki za informację.

    Pozdrawiam,
    Konrad

  2. @Kondrad,
    EF nie ma wsparcia nawet FileStream i samemu trzeba pisac kod odpowiedzialny za modyfikacje\odczyt danych.

    Pozdrawiam,
    Piotr

Leave a Reply

Your email address will not be published.