在前面的單元中有介紹到SQL Server 2012的新功能,就是FileTable的部份,這個功能的底層其實主要是透過FIleSteam,以前我們為了讓資料庫的可用性與輕巧靈活,如果有非結構化的資料大部份不會將資料直接存放在資料庫之中,而會將資料放置在主機上,然後將存放路徑存放在資料庫中,因為一來如果與一般的結構化資料放在一起時,如果使用者查詢時不小心使用了 "*" ,而資料欄位中又有二進位的資料時,容易造成資料撈取過慢,當然這樣的存放方式在日後維護上也不太方便,需要另外管理外部檔案與資料庫中欄位的相依性,所以微軟在SQL Server 2008的時候推出了FileStream,讓資料庫可以更適合用來操作與管理這些非結構化的檔案。
首先我先介紹FileStream為何,FileStream本身會將SQL Server與NTFS檔案系統進行整合,而存放方式主要透過barbinary(max)為型態存放在資料庫中,再轉為二進位大型物件(BLOB)資料儲存在檔案系統上。而透過Transact-SQL陳述式可以做到Insert、update、delete、select及備份FileStream資料。而且也可以透過Win32檔案系統介面的方式進行資料流的存取。
而FileStream會使用NT系統快取來儲存檔案資料,藉以減少FileStream資料可能對Database Engine效能的影響。而且也不會使用到SQL Server的緩衝集區,因此記憶體可以有效的用於查詢處理。
在下列的情況下,建議可以使用FileStream:
- 平均來說,儲存的物件大於 1 MB。
- 快速讀取權非常重要。
- 您正在開發將中介層用於應用程式邏輯的應用程式。
再來我就來介紹如何啟用FileStream,你可以透過 【啟動】 -> 【所有程式】 -> 【SQL Server 2008】-> 【Configuration Tools】 -> 【SQL Server Configuration Manager】
- Enable FileStream for transact-sql access : 是否啟用透過T/SQL存取FilesStream
- Enable FileStream for File I/O streaming access : 是否啟用Windows讀取或寫 入FilesStream。
- All remote clients to have streaming access to file stream data : 是否啟用遠端使用者存取FileStream的權限。
完成上述動作後,開啟SQL Server Management Studio,輸入下列語法即可。
1: EXEC sp_configure filestream_access_level, 2
-- 0 : Disable , 1 : Transact Sql Access , 2 : Win IO Access
2: GO
3: RECONFIGURE
4: GO
完成上述的設定後,開始就來測試FileStream對Database的支援測試,可以透過下列的T-SQL建立一個新的Database,建立完成後,你可以透過 [Database] -> [Properties],在 [Files] 與 [FileGroups] 中看到對於FileStream中的支援。
CREATE DATABASE cary_db
ON
PRIMARY ( NAME = carydb_1,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\carydb.mdf'),
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = carydb_2,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\carydb_Stream')
LOG ON ( NAME = carydb_log,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\carydb.ldf')
GO
在最後我就實際的建立一個資料表,用來儲存檔案當成最後的結尾,我會在另一篇的文章中,再來介紹實際的用法。
CREATE TABLE [dbo].[cary_files](
[sn] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
[systemid] [int] NOT NULL,
[filedata] [varbinary](max) FILESTREAM NULL
) ON [PRIMARY]
GO
請問 如果目前 資料庫未開啟此功能,在開啟後
回覆刪除現有資料庫 是否就可已有此功能
或是 需新建 的資料庫才可以
在你開啟後資料庫引擎就有支援FileStream的功能,日後你新建的資料庫都可以支援,但是你已建立的資料庫還是沒有支援,你需要手動再加入一個FileStream即可,你可以試試下列的語法即可加入:
回覆刪除ALTER DATABASE [YourDatabaseName]
ADD FILEGROUP [YourFileStreamGroup] CONTAINS FILESTREAM
GO
ALTER DATABASE [YourDatabaseName]
ADD FILE (NAME = N'YourFileStreamName', FILENAME = N'D:\CaryHsu\FileStreamData')
TO FILEGROUP YourFileStreamGroup
GO
瞭解,謝謝。
回覆刪除謝謝分享, 獲益良多, 感謝
回覆刪除