SQL Server 2012 új funkció – File Table

Alapvetően nem egy új funkció, csak a Filestream továbbfejlesztése. Nekem pl. ez a funkció segít rendbetenni a dokumentumaimat- nesze nekem BigData. Lényegében a FileTable egy adott séma alapján – windows API-k segítségével – visszaadja egy “mappa” tartalmát, a fastruktúra megtartásával.

A FileTable oszlopai:

  • stream_id: ez egy egyedi azonosító a mappára vagy file-ra. Típusa mi más lenne mint uniqueidentifier :-)
  • file_stream: ez maga az adat, mappa, file. Itt érdemes megjegyezni egy nagyon fontos dolgot: a FileStream és a FileTable esetében a 2 GB limit nem érvényes, mint a varbinary(max) típusra. Lásd BOL: http://technet.microsoft.com/en-us/library/bb933993(SQL.105).aspx 
  • name: a file vagy a mappa neve.
  • path_locator: ez egy hierarchyid típusú mező, ami a mappák fastruktúrájában azonosítja egy elem helyét.
  • parent_path_locator: ez mutatja meg, hogy melyik elem áll az adott elem felett a hierarchiában.
  • file_type: fájl típusa, mappa esetén NULL értéket vesz fel. a Full-Text Search esetében használható a TYPE COLUMN megadásakor.
  • cached_file_size: a fájl méretét adja meg. Ez egy számított oszlop.
  • creation_time: a file létrehozásának dátuma, melyet a Windows API ad vissza.
  • last_access_time: a fájl utolsó hozzáférésének/megnyitásának időpontja.
  • is_directory: ha az értéke 1, akkor mappa az adott elem.
  • is_offline: Ha az értéke 1, akkor offline fájl.
  • is_hidden: rejtett fájl, ha az értéke 1.
  • is_readonly:  csak olvasható, ha az értéke 1.
  • is_archive: archív, ha az értéke 1.
  • is_system: rendszer file, ha az értéke 1.
  • is_temporary: ideiglenes file, ha az értéke 1.

Hogyan hozható létre FileTable?

A FileTable létrehozása előtt enegdélyezni kell pár dolgot az SQL Server-ben insatnce, majd adatbázis szinten. Az alábbi lépések segítségével felépítek egy egyszerű adatbázist, ahol mindenféle dokumentumokat fogok tárolni, majd keresni is fogok bennük.

Instance szintű beállítások

FILESTREAM engedélyezése

  • Indítsuk el az SQL Server Configuration Manager-t. (itt figyeljünk arra, hogy az SQL Server 2012-höz kiadott verziót indítsuk el!!!)
  • Navigáljunk az SQL Server Services menüpontra.
  • Nyomjunk jobb egérgombot az SQL Server instance-n, majd kattinsunk a Properties menüpontra,
  • Az alábbi kép szerint engedélyezzük a FILESTREAM-et (csak helyi elérésre van szükségem, így csak azt engedélyeztem)
    image
  • Futtassuk le az alábbi query-t:
    EXEC sp_configure filestream_access_level, 2;
    RECONFIGURE;
    GO
  • A beállítások érvényesítéséhez nyomjuk meg az OK gombot, majd indítsuk újra az SQL Server service-t.

Adatbázis beállítások

A példa egyszerűsítése érdekében létrehozok egy teljesen új adatbázist. A példa adatbázis beállításait nem feltétlenül ajánlom éles környezetben :-)

Adatbázis létrehozása

Az alábbi script segítségével hozzuk létre a minta adatbázist:

USE [master];
GO
IF DATABASEPROPERTYEX('FileTableDB', 'Version') > 0
	ALTER DATABASE [FileTableDB] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE;
	DROP DATABASE [FileTableDB];
GO

CREATE DATABASE [FileTableDB]
ON  PRIMARY (NAME = N'FileTableDB', FILENAME = N'C:\Temp\FileTableDB.mdf'), 
FILEGROUP [FILESTREAM_FG] CONTAINS FILESTREAM  DEFAULT (NAME = N'FILESTREAM_FG',
FILENAME = N'C:\temp\FILESTREAM_STORAGE' , MAXSIZE = UNLIMITED)
LOG ON (NAME = N'FileTableDB_log', FILENAME = N'C:\temp\FileTableDB_log.ldf')
GO

 

Figyeljük meg, hogy van egy FILESTREAM FileGroup is, illetve győződjünk meg arról, hogy létezik a c:\temp mappa és az SQL Server service account-nak van joga a mappához.

Adatbázis szintű beállítások

Az alábbi beállítások szükségesek ahhoz, hogy az adatbázisunk tudja kezelni a FileTable táblákat.

ALTER DATABASE [FileTableDB] SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME=N'FileTableDB_FileTablesDirectory') WITH NO_WAIT;
GO

A kódban két fontos opció is felfedezhető a FILESTREAM-el kapcsolatban:

  • NON_TRANSACTED_ACCESS: három állapota van ennek a beállításnak: OFF, READ_ONLY és FULL. Én most a FULL-t állítom be.
  • DIRECTORY_NAME: az a mappa neve, amiben az adatbázishoz tartozó FileTable adatok lesznek letárolva. Nagyon fontos, hogy ennek a mappának a neve egyedi kell legyen egy instance-en belül. Én azt a névkonvenciót szoktam alkalmazni, hogy <adatbázisnév>_<mappanév>. Így van esély arra, hogy egyedi lesz.

Ezekkel a beállításokkal már neki lehet állni létrehozni a FileTable-t.

A FileTable

Az alábbi kód segítségével létre tudjuk hozni a FileTable-t.

CREATE TABLE [dbo].[FileTableSample] AS FILETABLE 
ON [PRIMARY] FILESTREAM_ON [FileTableDBFileStreamFG]
WITH
(
FILETABLE_DIRECTORY = N'FileTableSample', 
FILETABLE_COLLATE_FILENAME = database_default
)

Két fontos dolgot kell megfigyelni itt is:

  • a FILETABLE_DIRECTORY paraméter megadja, hogy a FILESTREAM mappában, mi legyen annak a mappának a neve, amiben ehhez FileTable-höz tartozó file és mappák legyenek.
  • FILETABLE_COLLATE_FILENAME: ez adja meg a collation-jét a FileTable name oszlopának.

Ha kész is van a táblánk, akkor azt láthatjuk az SSMS-ben:

image

Adatbetöltés

Két módon lehet adatot tenni a FileTable-be:

  • Transact-SQL segítségével és
  • File másolással.

Transact-SQL adatbetöltés

Itt azért ne várjunk csodákat SmileA file másolás a legjobb megoldás, az alábbi kód csak szemléltetés:

INSERT INTO [dbo].[FileTableSample] ([file_stream], [name]) 
VALUES (CAST('test text in the file' AS varbinary(max)), 'test.txt')

Hagyományos adatbetöltés

Itt a hagyományos másolás, xcopy, robocopy mehet. Alapvetően egy-egy FileTable-nek van saját elérési útvonala, ami lekérdezhető az alábbiak szerint:

SELECT FILETABLEROOTPATH('[dbo].[FileTableSample]')

Ez visszaadja az elérési utat, ami az adott FileTable-nek be lett állítva:

\\<Computername>\<FileStreamShareName>\<FileStreamDefaultFolder>\<YourFileTableFolder>\

Esetemben ez így nézett ki:

\\ROADRUNNER\SQL2012\FileTableDB_FileTablesDirectory\FileTableSample

Miután ebbe a mappába bemásoltam pár dokumentumot, a FileTable így nézett ki:

SELECT * FROM [FileTableSample]

image

Vigyázat, a file_stream oszlop visszaadja a file varbinary formátumát! Ez nem igazán jó ötlet, ha lekérdezéseket csinálunk az SSMS-ben, nem igazán szerette nekem sem a 8GB-os file-t Smile

Add comment