日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你!

發(fā)布時(shí)間:2024/8/23 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者 |?ALEN ?BRI?

譯者 | 火火醬,責(zé)編 | Carol

封圖 |?CSDN 付費(fèi)下載于視覺中國(guó)?

? ?

在本文中,我將解釋如何使用SQL Server FILESTREAM來存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù)。同時(shí),還會(huì)介紹FILESTREAM的優(yōu)缺點(diǎn)。

在SQL Server的早期版本中,非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)在維持結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)間一致性、管理備份/還原過程、性能問題、可擴(kuò)展性等方面提出了許多挑戰(zhàn)。在SQL Server 2008之前的MSSQL早期版本中,存在各種用于存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù)的機(jī)制。這些信息通常被以文件的形式存儲(chǔ)在共享文件夾中,其訪問權(quán)限被授予了某些用戶。

這些文件的UNC路徑通常作為表(varchar (n))中的一列存儲(chǔ)于數(shù)據(jù)庫中,以便應(yīng)用程序邏輯可以訪問特定的文件。但文件的安全性、管理其訪問權(quán)并對(duì)其進(jìn)行維護(hù)方面存在一定問題。

后來的二進(jìn)制大對(duì)象(Binary Large Objects,BLOB)概念在一定程度上有助于存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù)。這個(gè)概念的主要優(yōu)點(diǎn)是數(shù)據(jù)庫中的集成管理和事務(wù)一致性。在這種情況下,安全問題(以前的文件解決方案)得到了解決。但仍存在一些問題,即2GB的限制以及日志文件過載。

為了解決這些問題,SQL Server 2008首次引入了名為FILESTREAM的增強(qiáng)功能。

它不是VARBINARY (MAX)這樣的數(shù)據(jù)類型,而是通過VARBINARY列設(shè)置的attribute/property,表明數(shù)據(jù)應(yīng)該被直接存儲(chǔ)在文件系統(tǒng)上。這些數(shù)據(jù)仍然是系統(tǒng)的組成部分,并保持事務(wù)一致性。

以下是FILESTREAM的一些特征:

  • 二進(jìn)制數(shù)據(jù)作為單獨(dú)的文件存儲(chǔ)在數(shù)據(jù)庫之外。

  • 可以通過WIN32 API對(duì)這些單獨(dú)的文件進(jìn)行操作。

  • T-SQL語句適用。

  • 通過FILESTREAM存儲(chǔ)在文件系統(tǒng)中的對(duì)象已經(jīng)取消了VARBINARY (MAX)列的2GB文件大小限制。

  • FILESTREAM還可以被用在壓縮文件、磁盤、卷中。

要使用FILESTREAM,必須將其激活。FILESTREAM可在兩個(gè)級(jí)別上啟用。第一級(jí)是SQL Server級(jí)別。該級(jí)別在安裝SQL Server時(shí)被啟用。如果沒這樣做的話,可以選中SQL Server FILESTREAM選項(xiàng)卡上的復(fù)選框,通過SQL Server 配置管理器來啟用(圖1)。? ? ? ?

??圖1. 使用SQL Server 配置管理器在SQL Server級(jí)別啟用FILESTREAM

啟用FILESTREAM的第二個(gè)級(jí)別是SQL Server Instance(實(shí)例)級(jí)別。通過執(zhí)行腳本1中提供的T-SQL腳本來實(shí)現(xiàn)。

EXEC?sp_configure?filestream_access_level,?2 RECONFIGURE

?

腳本1:在Server Instance 級(jí)別啟用FILESTREAM

表 1 列出了filestream_access_level的可能值。

描述

0

禁用FILESTREAM 對(duì)此實(shí)例的支持.

1

啟用FILESTREAM 進(jìn)行Transact-SQL 訪問.

2

啟用FILESTREAM 進(jìn)行Transact-SQL 和Win32 流訪問.

表1. filestream_access_level的可能值

下一步是創(chuàng)建一個(gè)數(shù)據(jù)庫,可以在其中創(chuàng)建將使用FILESTREAM的表。腳本2給出了一個(gè)T-SQL腳本示例,該腳本能夠創(chuàng)建可以使用FILESTREAM的數(shù)據(jù)庫。

CREATE?DATABASE?Test_FILESTREAM ON PRIMARY( NAME=Test_FILESTREAM_Prmary, FILENAME='d:\sqlbaza2019\mssql\data\FILESTREAM\Test_FILESTREAM.mdf'), 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\Test_FILESTREAM.log')

腳本2:創(chuàng)建可以使用FILESTREAM的數(shù)據(jù)庫的示例

在文件系統(tǒng)上執(zhí)行腳本2將創(chuàng)建一個(gè)$ FSLOG文件夾和文件filestream.hdr。該filestream.hdr文件是FILESTREAM容器的頭文件。

下一步要?jiǎng)?chuàng)建一個(gè)具有列VARBINARY (MAX)和FILESTREAM屬性(腳本3)的表。

USE?Test_FILESTREAM CREATE?TABLE?[dbo].[Fajlovi] ( ID?UNIQUEIDENTIFIER?NOT?NULL?ROWGUIDCOL?PRIMARY?KEY, Fajl?VARBINARY(MAX)?FILESTREAM?DEFAULT?NULL )

腳本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)建一個(gè)新文件夾。

可以通過執(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列中的每個(gè)單元格都是一個(gè)與其關(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ù),但這是一個(gè)更自然的MS Visual Studio環(huán)境。通過System.Data.SqlTypes.SqlFileStream 類,可以在應(yīng)用程序邏輯中使用FILESTREAM功能。為了保持?jǐn)?shù)據(jù)的一致性,每個(gè)SQL FILESTREAM操作都必須是事務(wù)的一部分。MARS(多個(gè)活動(dòng)結(jié)果集Multiple Active Result Sets)連接具有批處理事務(wù)的特殊規(guī)則,而T-SQL BEGIN TRANSACTION語句違反了這些規(guī)則。為了避免這個(gè)問題,應(yīng)用程序客戶端應(yīng)該使用合適的事務(wù)管理API來表示類System.Data.SqlClient.SqlTransaction。

為了允許事務(wù)訪問FILESTREAM數(shù)據(jù)文件系統(tǒng),需要使用T-SQL函數(shù)GET FILESTREAM TRASACTION CONTEXT()來提供表示特定會(huì)話(C # code 1)中當(dāng)前事務(wù)的令牌。

SqlConnection?sqlConnection?=?new?SqlConnection( "Integrated?Security=true;server=(local)"); SqlCommand?sqlCommand?=?new?SqlCommand(); sqlCommand.Connection?=?sqlConnection; SqlTransaction?transaction?=?sqlConnection.BeginTransaction("mainTranaction"); sqlCommand.Transaction?=?transaction; sqlCommand.CommandText?= "SELECT?GET_FILESTREAM_TRANSACTION_CONTEXT()"; Object?obj?=?sqlCommand.ExecuteScalar(); byte[]?txContext?=?(byte[])obj;

?

C # code 1. 使用 GET_FILESTREAM_TRASACTION_CONTEXT () 函數(shù)

這樣一來,事務(wù)已啟動(dòng),但還沒有提交或回滾。使用FILESTREAM數(shù)據(jù)的多個(gè)操作可以在一個(gè)事務(wù)中執(zhí)行。在C # code 2中給出了使用Win32 API的數(shù)據(jù)輸入代碼的示例,其中sqlFileStream對(duì)象最初是基于System.Data.SqlType類創(chuàng)建的。

SqlFileStream?sqlFileStream?=?new?SqlFileStream(filePath,?txContext,?FileAccess.ReadWrite); byte[]?buffer?=?new?byte[512]; int?numBytes?=?0; //Write?string,?"FILESTREAM?test?data"?in?FILESTREAM. string?someData?=?"FILESTREAM?test?data"; Encoding?unicode?=?Encoding.GetEncoding(0); sqlFileStream.Write(unicode.GetBytes(someData.ToCharArray()),0,someData.Length);

?

C # code 2. 在FILESTREAM中輸入數(shù)據(jù)的示例代碼

C # code 3中給出了使用Win32 API讀取FILESTREAM數(shù)據(jù)的示例代碼。這里使用的是在c# code 1示例開始時(shí)創(chuàng)建的同一個(gè)sqlFileStream對(duì)象。

sqlFileStream.Seek(0L,?SeekOrigin.Begin); numBytes?=?sqlFileStream.Read(buffer,?0,?buffer.Length); string?readData?=?unicode.GetString(buffer); if?(numBytes?!=?0) Console.WriteLine(readData);

?

C # code 3. 讀取FILESTREAM數(shù)據(jù)的示例代碼

在完成FILESTREAM注冊(cè)事務(wù)(C # code 1)并讀取FILESTREAM數(shù)據(jù)(C # code 2)之后,sqlFileStream對(duì)象(在C # code 1示例的開頭基于System.Data.SqlTypes.SqlFileStream類創(chuàng)建的)必須關(guān)閉并提交事務(wù)(C # code 4)。sqlCommand對(duì)象是在示例C # code1的開頭創(chuàng)建的。

sqlFileStream.Close(); sqlCommand.Transaction.Commit();

?

C # code 4. 關(guān)閉sqlFileStream對(duì)象并提交事務(wù)

在圖3中給出了VARBINARY (MAX)和FILESTREAM被用于存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù)和使用T-SQL 或Win32訪問數(shù)據(jù)時(shí)數(shù)據(jù)加載性能的對(duì)比圖。

?

圖3.不同大小的 BLOB的負(fù)載性能

還應(yīng)該注意,FILESTREAM也被用于其他SQL Server技術(shù)中,例如FileTable和In-Memory OLTP。

最后

與其他技術(shù)一樣,FILESTREAM也有其優(yōu)缺點(diǎn)。

優(yōu)點(diǎn):

  • 作為FILESTREAM的一部分創(chuàng)建的文件由SQL Server本身在其自己的文件組中進(jìn)行管理,在這些文件組中可以與其他SQL Server數(shù)據(jù)一起進(jìn)行備份和還原。

  • 讀寫這些文件是數(shù)據(jù)庫事務(wù)的一部分。

  • 可以存儲(chǔ)非常大的BLOB對(duì)象。

缺點(diǎn):

  • FILESTREAM數(shù)據(jù)只能被存儲(chǔ)在本地磁盤卷中。

  • 數(shù)據(jù)庫快照中不支持。

  • 數(shù)據(jù)庫鏡像不支持。

  • 不支持透明數(shù)據(jù)加密。

  • 不能與表值參數(shù)一起使用。

原文鏈接:https://www.experfy.com/blog/how-to-use-sql-server-filestream-to-store-unstructured-data

本文為 CSDN 翻譯,轉(zhuǎn)載請(qǐng)注明出處。

?

推薦閱讀

  • 對(duì)不起,我把APP也給爬了

  • 震驚!阿里的程序員竟被一個(gè)簡(jiǎn)單的 SQL 查詢難住了!

  • 巧用 Trie 樹,實(shí)現(xiàn)搜索引擎關(guān)鍵詞提示功能

  • 第一個(gè)"國(guó)產(chǎn)"Apache 頂級(jí)項(xiàng)目 Kylin,了解一下!| 原力計(jì)劃

  • 華為 5G、阿里檢測(cè)病毒算法、騰訊 AI 一分鐘診斷,國(guó)內(nèi)抗疫科技大閱兵!

  • 超級(jí)賬本Hyperledger Fabric中的Protobuf到底是什么?

真香,朕在看了!

總結(jié)

以上是生活随笔為你收集整理的如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。