FileTable to świetny pomysł na przechowywanie w bazie dokumentów (BLOB), które jednocześnie są dla użytkowników widoczne jako zwykłe pliki na systemie plików.
Żeby FileTable (a ogólniej Filestream) mogły działać odpowiednio należy skonfigurować instancję. We właściwościach usługi SQL Server w SQL Server Configuration Manager należy ustawić FILESTREAM (patrz również tutaj)
Konfigurację wykonujemy również w opcjach serwera:
EXEC sp_configure 'filestream access level' GO EXEC sp_configure 'filestream access level',2 GO RECONFIGURE GO EXEC sp_configure 'filestream access level GO
Pora na utworzenie testowej bazy danych
CREATE DATABASE TestFileTable GO
Ta baza danych musi posiadać FILE GROUP pozwalający na przechowywanie FILESTREAM
USE TestFileTable GO ALTER DATABASE TestFileTable ADD FILEGROUP FG_FileStream CONTAINS FILESTREAM GO
A z kolei ta grupa musi mieć plik. Zadbaj o to aby usługa SQL miała pełne prawa do katalogu nadrzędnego tutaj C:\SQL
ALTER DATABASE TestFileTable ADD FILE (NAME='F_FileStream', FILENAME='C:\SQL\AdventureWorks_FS') TO FILEGROUP FG_FileStream GO
Baza będzie przechowywać dokumenty w udostępnianym zasobie o nazwie Docs. Dostęp może być tak jak tu FULL (pliki można modyfikować z poziomu aplikacji np Word, Excel itp), READ_ONLY, lub OFF
ALTER DATABASE TestFileTable SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME='Docs') GO
Teraz można utworzyć tabelę
CREATE TABLE Manuals AS FILETABLE WITH(FILETABLE_DIRECTORY='Manuals') GO
Jeżeli wkopiujesz pliki do katalogu \\computerName\MSSQLSERVER\Docs\Manuals, to w tabeli Manuals pojawią się rekordy. Podobnie usuwanie tych plików spowoduje, że rekordy będą kasowane
SELECT * FROM Manuals GO
Tabele FileTable można odnaleźć zaglądając do widoków systemowych:
SELECT * FROM sys.filetables; GO SELECT * FROM sys.tables WHERE is_filetable = 1; GO SELECT object_id, OBJECT_NAME(object_id) AS 'Object Name' FROM sys.filetable_system_defined_objects; GO SELECT DB_NAME(database_id), non_transacted_access, non_transacted_access_desc FROM sys.database_filestream_options; GO
Poziom dostępu do plików w FileTable można zmieniać:
ALTER DATABASE TestFileTable SET FILESTREAM (NON_TRANSACTED_ACCESS = OFF, DIRECTORY_NAME='Docs') GO SELECT DB_NAME(database_id), non_transacted_access, non_transacted_access_desc FROM sys.database_filestream_options; GO ALTER DATABASE TestFileTable SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME='Docs') GO
Jeśli rekord zostanie usunięty z tabeli, to zniknie również plik z katalogu
DELETE FROM Manuals WHERE Name = 'New Text Document (2).txt' GO SELECT * FROM Manuals