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):
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:
Dwukrotnie klikamy na usłudze, przechodzimy do zakładki FileStream i aktywujemy FIleStream:
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:
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:
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:
Wykonując teraz powyższe zapytanie SELECT, rezultat będzie następujący:
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:
Analogicznie, możemy usunąć plik:
delete from FileTableTest WHERE stream_id = 'B40A2D6E-D4BC-E311-BE94-606C6688A184'
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
@Kondrad,
EF nie ma wsparcia nawet FileStream i samemu trzeba pisac kod odpowiedzialny za modyfikacje\odczyt danych.
Pozdrawiam,
Piotr