SQL: Jak pracować z FileTable. Konfiguracja bazy, tworzenie tabeli

12-Mar-2018

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

Dodaj komentarz:

Autor: Rafał Kraik