上一篇筆記varbinary儲存小型文件檔案,當使用者上傳檔案平均超過1MB,我們就可以考慮SQL Server 2008 推出的Filestream。
如果想透過網芳上傳檔案到sql server機器再從sql table取得目錄資訊,則可以考慮SQL Server 2012推出的File table。
這篇先筆記FileStream要設定的步驟:
1.開啟SQL Server 組態管理員,點選對應的Database Engine,按下右鍵內容並勾選以下選項後,按下確認。
- 啟用FileStream的transact-sql 存取
- 啟用FileStream的檔案I/O存取
- 啟用遠端用戶的FileStream資料夾存取。
2.設定SQL INSTANCE Filestream存取層級
--設定FILESTREAM存取層級
EXEC sp_configure FILESTREAM_ACCESS_LEVEL, 2
GO
RECONFIGURE
GO
--0 針對這個執行個體停用 FILESTREAM 支援。
--1 針對 Transact-SQL 存取啟用 FILESTREAM。
--2 針對 Transact-SQL 和 Win32 資料流存取啟用 FILESTREAM。
3.對現有資料表增加檔案群組及檔案
ALTER DATABASE [DEMO]
ADD FILEGROUP [FGStream] CONTAINS FILESTREAM
GO
ALTER DATABASE [DEMO]
ADD FILE (NAME = N'FileStreamDoc', FILENAME = N'T:\SQL\FileStream')
TO FILEGROUP [FGStream]
GO
4.建立具有File Stream欄位的資料表。
建立資料表時需要注意兩個地方:
A.這個資料表必須有一個非NULL且唯一的ROWGUIDCOL欄位。
B.放置大型二進位物件的欄位必須加上FILESTREAM。
IF EXISTS (SELECT name FROM sys.tables WHERE name = N'Document')
DROP table Document;
CREATE TABLE [dbo].[Document](
[GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
[CONTENT_TYPE] [nvarchar](100) NULL,
[FILE_NAME] [nvarchar](50) NULL,
[DATA] [varbinary](max) FILESTREAM NULL,
[SIZE] [numeric](13, 2) NULL,
[MNT_USER] [varchar](20) NULL,
[MNT_DT] [datetime] NULL
) ON [PRIMARY]
GO
未符合條件1會出現以下訊息:
--訊息 5505,層級 16,狀態 1,行 50
--具有 FILESTREAM 資料行的資料表必須有非 NULL 的唯一 ROWGUIDCOL 資料行。
5.程式碼調整
可參考上一篇筆記varbinary上傳檔案的步驟2.3.4
因為檔案鍵值GUID由Identity int改為[uniqueidentifier],這邊寫入時需要調整使用new_id()方法取得uniqueidentifier序號。
string query = "insert into Document1 values (newid(),@CONTENT_TYPE,@FILE_NAME,@DATA,@SIZE,@MNT_USER,@MNT_DT)";
其他地方皆相同!
6.測試兩個檔案上傳
上傳ok
進入資料庫本機目錄觀察:
高可用性上的適用性:
- Failover clustering: When you are using failover clustering, the FILESTREAM filegroups must be on shared disk resources.
- AlwaysOn: All FILESTREAM functionality is supported. After a failover, FILESTREAM data is accessible on both readable secondary replicas and on the new primary.(注意kb3089527)
參考:
FILESTREAM and FileTable with AlwaysOn Availability Groups (SQL Server)