作者| alenbri
譯者|大醬、書篇|卡羅爾
封面| CSDN付費下載到視覺中國
本文檔將介紹如何使用SQL Server FILESTREAM存儲非結(jié)構(gòu)化數(shù)據(jù)。
同時,還會介紹FILESTREAM的優(yōu)缺點。在SQL Server的早期版本中,非結(jié)構(gòu)化數(shù)據(jù)的存儲在維持結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)間一致性、管理備份/還原過程、性能問題、可擴展性等方面提出了許多挑戰(zhàn)。在SQL Server 2008之前??mssqlL早期版本中,存在各種用于存儲非結(jié)構(gòu)化數(shù)據(jù)的機制。這些信息通常被以文件的形式存儲在共享文件夾中,其訪問權(quán)限被授予了某些用戶。
這些文件的UNC路徑通常作為表(varchar (n))中的一列存儲于數(shù)據(jù)庫中,以便應(yīng)用程序邏輯可以訪問特定的文件。但文件的安全性、管理其訪問權(quán)并對其進行維護方面存在一定問題。
后來的二進制大對象(Binary Large Objects??BLOBB)概念在一定程度上有助于存儲非結(jié)構(gòu)化數(shù)據(jù)。這個概念的主要優(yōu)點是數(shù)據(jù)庫中的集成管理和事務(wù)一致性。在這種情況下,安全問題(以前的文件解決方案)得到了解決。但仍存在一些問題,即2GB的限制以及日志文件過載。
為了解決這些問題,SQL Server 2008首次引入了名為FILESTREAM的增強功能。
它不是VARBINARY (MAX)這樣的數(shù)據(jù)類型,而是通過VARBINARY列設(shè)置的attribute/property,表明數(shù)據(jù)應(yīng)該被直接存儲在文件系統(tǒng)上。這些數(shù)據(jù)仍然是系統(tǒng)的組成部分,并保持事務(wù)一致性。
以下是FILESTREAM的一些特征:
二進制數(shù)據(jù)作為單獨的文件存儲在數(shù)據(jù)庫之外。
可以通過WIN32 API對這些單獨的文件進行操作。
T-SQL語句適用。
通過FILESTREAM存儲在文件系統(tǒng)中的對象已經(jīng)取消了VARBINARY (MAX)列的2GB文件大小限制。
FILESTREAM還可以被用在壓縮文件、磁盤、卷中。
要使用FILESTREAM,必須將其激活。FILESTREAM可在兩個級別上啟用。第一級是SQL Server級別。該級別在安裝SQL Server時被啟用。如果沒這樣做的話,可以選中SQL Server FILESTREAM選項卡上的復(fù)選框,通過SQL Server 配置管理器來啟用(圖1)。
圖1. 使用SQL Server 配置管理器在SQL Server級別啟用FILESTREAM
啟用FILESTREAM的第二個級別是SQL Server Instance(實例)級別。通過執(zhí)行腳本1中提供的T-SQL腳本來實現(xiàn)。
EXEC sp_configure filestream_access_level, 2
RECONFIGURE
腳本1:在Server Instance 級別啟用FILESTREAM
表 1 列出了filestream_access_level的可能值。
值 | 描述 |
0 | 禁用FILESTREAM 對此實例的支持. |
1 | 啟用FILESTREAM 進行Transact-SQL 訪問. |
2 | 啟用FILESTREAM 進行Transact-SQL 和Win32 流訪問. |
表1. filestream_access_level的可能值
下一步是創(chuàng)建一個數(shù)據(jù)庫,可以在其中創(chuàng)建將使用FILESTREAM的表。腳本2給出了一個T-SQL腳本示例,該腳本能夠創(chuàng)建可以使用FILESTREAM的數(shù)據(jù)庫。
CREATE DATABASE Test_FILESTREAMON
PRIMARY(
NAME=Test_FILESTREAM_Prmary,
FILENAME='d:\sqlbaza2019\mssql\data\FILESTREAM\Te;),
FILEGROUP FileStreamGroup CONTAINS FILESTREAM(
NAME=Test_FILESTREAM_FM,
FILENAME='d:\sqlbaza2019\mssql\data\FILESTREAM\Test_FILESTREAM_FM')
LOG ON (
NAME=Test_FILESTREAM_Log,
FILENAME='d:\sqlbaza2019\mssql\data\FILESTREAM\Te;)
腳本2:創(chuàng)建可以使用FILESTREAM的數(shù)據(jù)庫的示例
在文件系統(tǒng)上執(zhí)行腳本2將創(chuàng)建一個$ FSLOG文件夾和文件。該文件是FILESTREAM容器的頭文件。
下一步要創(chuàng)建一個具有列VARBINARY (MAX)和FILESTREAM屬性(腳本3)的表。
USE Test_FILESTREAM
CREATE TABLE [dbo].[Fajlovi]
(
ID UNIQUEIDENTIFIER NOT ROWGUIDCOL PRIMARY KEY,
Fajl VARBINARY(MAX) FILESTREAM DEFAULT
)
腳本3. 使用VARBINARY (MAX) FILESTREAM 列創(chuàng)建表
仍然需要將記錄插入到新創(chuàng)建的表中(腳本4)。
INSERT INTO Fajlovi
VALUES (newid, cast('My test FIESTREAM-a' as varbinary(max)))
腳本4.使用 VARBINARY (MAX) FILESTREAM 列將記錄插入到表中
用腳本4插入記錄還將在文件系統(tǒng)上創(chuàng)建一個新文件夾。
可以通過執(zhí)行腳本5從具有VARBINARY (MAX) FILESTREAM列的表中獲取記錄。
select * from [Test_FILESTREAM].[dbo].[Fajlovi]
腳本5. 使用VARBINARY (MAX) FILESTREAM 列從表中查看記錄
執(zhí)行腳本5的結(jié)果如圖2所示。
圖2. 具有VARBINARY (MAX) FILESTREAM列的表中的紀(jì)錄
FILESTREAM列中的每個單元格都是一個與其關(guān)聯(lián)的文件系統(tǒng)上的文件路徑。要想讀取路徑的話,需要在T-SQL語句中使用varbinary (max)列的PathName屬性。腳本6提供了如何讀取varbinary (max)列文件路徑的示例。
DECLARE @filePath varchar(max)
SELECT @filePath = Fajl.PathName
FROM dbo.Fajlovi
WHERE ID = 'F9A149D0-F5F0-4FC5-9F59-1D27E4D10C1D'
PRINT @filepath
腳本6. 讀取文件系統(tǒng)上的FILESTREAM 文件路徑的示例
可以使用T-SQL處理FILESTREAM數(shù)據(jù),但這是一個更自然的MS Visual Studio環(huán)境。通過Sy 類,可以在應(yīng)用程序邏輯中使用FILESTREAM功能。為了保持數(shù)據(jù)的一致性,每個SQL FILESTREAM操作都必須是事務(wù)的一部分。MARS(多個活動結(jié)果集Multiple Active Result Sets)連接具有批處理事務(wù)的特殊規(guī)則,而T-SQL BEGINTransactionN語句違反了這些規(guī)則。為了避免這個問題,應(yīng)用程序客戶端應(yīng)該使用合適的事務(wù)管理API來表示類Sy。
為了允許事務(wù)訪問FILESTREAM數(shù)據(jù)文件系統(tǒng),需要使用T-SQL函數(shù)GET FILESTREAM TRASACTION CONTEXT來提供表示特定會話(C # code 1)中當(dāng)前事務(wù)的令牌。
SqlConnection sqlConnection = new SqlConnection(
"Integrated Security=true;server=(local)");
SqlCommand sqlCommand = new SqlCommand;
= sqlConnection;
SqlTransaction transaction = ("mainTranaction");
= transaction;
=
"SELECT GET_FILESTREAM_TRANSACTION_CONTEXT";
Object obj = ;
byte txContext = (byte[])obj;
C # code 1. 使用 GET_FILESTREAM_TRASACTION_CONTEXT 函數(shù)
這樣一來,事務(wù)已啟動,但還沒有提交或回滾。使用FILESTREAM數(shù)據(jù)的多個操作可以在一個事務(wù)中執(zhí)行。在C # code 2中給出了使用Win32 API的數(shù)據(jù)輸入代碼的示例,其中sqlFileStream對象最初是基于Sy類創(chuàng)建的。
SqlFileStream sqlFileStream = new SqlFileStream(filePath, txContext, FileAcce);
byte buffer = new byte[512];
int numBytes = 0;
//Write string, "FILESTREAM test data" in FILESTREAM.
string someData = "FILESTREAM test data";
Encodingunicodee = Encoding.GetEncoding(0);
),0,);
C # code 2. 在FILESTREAM中輸入數(shù)據(jù)的示例代碼
C # code 3中給出了使用Win32 API讀取FILESTREAM數(shù)據(jù)的示例代碼。這里使用的是在c# code 1示例開始時創(chuàng)建的同一個sqlFileStream對象。
(0L, SeekOrigin.Begin);
numBytes = (buffer, 0, bu);
string readData = unicode.GetString(buffer);
if (numBytes != 0)
Con(readData);
C # code 3. 讀取FILESTREAM數(shù)據(jù)的示例代碼
在完成FILESTREAM注冊事務(wù)(C # code 1)并讀取FILESTREAM數(shù)據(jù)(C # code 2)之后,sqlFileStream對象(在C # code 1示例的開頭基于Sy類創(chuàng)建的)必須關(guān)閉并提交事務(wù)(C # code 4)。sqlCommand對象是在示例C # code1的開頭創(chuàng)建的。
;
.Commit;
C # code 4. 關(guān)閉sqlFileStream對象并提交事務(wù)
在圖3中給出了VARBINARY (MAX)和FILESTREAM被用于存儲非結(jié)構(gòu)化數(shù)據(jù)和使用T-SQL 或Win32訪問數(shù)據(jù)時數(shù)據(jù)加載性能的對比圖。
圖3.不同大小的 BLOB的負載性能
還應(yīng)該注意,F(xiàn)ILESTREAM也被用于其他SQL Server技術(shù)中,例如FileTable和In-Memory OLTP。
最后
與其他技術(shù)一樣,F(xiàn)ILESTREAM也有其優(yōu)缺點。
優(yōu)點:
作為FILESTREAM的一部分創(chuàng)建的文件由SQL Server本身在其自己的文件組中進行管理,在這些文件組中可以與其他SQL Server數(shù)據(jù)一起進行備份和還原。
讀寫這些文件是數(shù)據(jù)庫事務(wù)的一部分。
可以存儲非常大的BLOB對象。
缺點:
FILESTREAM數(shù)據(jù)只能被存儲在本地磁盤卷中。
數(shù)據(jù)庫快照中不支持。
數(shù)據(jù)庫鏡像不支持。
不支持透明數(shù)據(jù)加密。
不能與表值參數(shù)一起使用。
原文鏈接:
本文為 CSDN 翻譯,轉(zhuǎn)載請注明出處。
1.《怎么使用sqlserver?總結(jié)很全面速看!如何使用 SQL Server FILESTREAM 存儲非結(jié)構(gòu)化數(shù)據(jù)?》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《怎么使用sqlserver?總結(jié)很全面速看!如何使用 SQL Server FILESTREAM 存儲非結(jié)構(gòu)化數(shù)據(jù)?》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/gl/2980097.html