無料版のSQL Server 2019 Expressを使用していますが、エクセルやワード、PDFファイルなどを添付したテーブルを作成したいと調べていたら、FILESTREAMという機能を発見しました。
その機能を使ってファイル管理ができるのか試してみました。
FILESTREAMとは?
マイクロソフトの解説サイトを見ると難しい事が沢山書いてあります。
FILESTREAM を使用すると、SQL Server ベースのアプリケーションで非構造化データ (ドキュメントやイメージなど) をファイル システムに格納できます。 これにより、ファイル システムの豊富なストリーミング API と高いパフォーマンスをアプリケーションで活用できるほか、非構造化データとそれに対応する構造化データの間でトランザクションの一貫性も維持されます。
FILESTREAM は、varbinary(max) BLOB (バイナリ ラージ オブジェクト) データをファイル システム上のファイルとして格納することにより、SQL Server データベース エンジンと NTFS ファイル システムを統合します。 Transact-SQL ステートメントでは、FILESTREAM データの挿入、更新、クエリ、検索、およびバックアップを行うことができます。 Win32 ファイル システム インターフェイスによるデータへのストリーミング アクセスが可能になります。
つまり、様々なファイルがデータベース(※)に格納することが可能だってことだと理解しました。
※もしかしたら、別の場所にファイルを保存して、そのファイルと紐付させる方法とか???
調べると、Sqlserverへのファイルを保存する方法は2通りあるらしく、BLOB を通常の varbinary(max) データとしてテーブルに保存する方法、もうひとつは FILESTREAM を使って、 varbinary(max) オブジェクトをファイルシステムに保存する方法があるらしい。
その違いさえも良くわかりませんが、
ポイント
保存するファイルサイズが1MBより大きく高速な読込が必要ならFILESTREAM の利用が推奨
らしい。
FILESTREAMがいいってことじゃないですか!?
やるしかないですよね。
FILESTREAMの設定
なんで最初から設定なしで使えないのかが自分には理解できませんが、ぼやきながらも設定していきたいと思います。
FILESTREAMの有効化
SQL Server Configuration Manager で有効化したいデータベースエンジンのインスタンスを右クリックしプロパティを表示。
FILESTREAMのタブをクリックして、チェックを3ヶ所入れてOKにて有効化させました。
Windows共有名というのはデフォルトのままにしましたが、このフォルダが作成されて、ここにファイルが格納されるのでしょうかね。
設定が終わったらSQL Server Configuration Manager でデータベースエンジンのインスタンスを右クリックし再起動させました。
FILESTREAMのアクセスレベル設定
SQL Server Management Studio (SSMS)を使ってアクセスレベルの設定をしました。
下記のクエリを実行することで、Transact-SQL アクセスおよび Win32 ストリーム アクセスに対して FILESTREAM を有効にできるようです。
EXEC sp_configure filestream_access_level, 2;
RECONFIGURE;
なんか、インストールしろって出てきていますが放置して次にいきました。
既存のデータベースに対して FILESTREAM有効化設定
対象のデータベースの上で右クリックをしてプロパティにいきます。
ファイルグループの追加をして、適当な名前を入れます。
次に、ファイルに移動して、下記の様な設定をしました。
そうすると、下記のような場所にデータが作成されました。
FILESTREAMデータを保存テーブル作成
MSSMSから、下記のクエリを実行してテーブルを作成しました。
CREATE TABLE UploadFile (
FileID UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL PRIMARY KEY,
FileData VARBINARY(MAX) FILESTREAM NULL,
UploadFileName NVARCHAR(100) NULL
);
Accessからファイル添付しようとするが断念
自分が今回やりたかったのは、
ココに注意
SqlserverにODBC接続したAccessからファイル添付をやりたかった
のです。
作成したテーブルをフォームに起こして、ファイル添付したいファイルをドラッグ&ドロップするとファイルが入力されたようなアイコンになりますが、エラーになります。
フィールドの型が違うのかと思い色々と試しましたが、このエラーを乗り越えられませんでした。
スキルが足りなく断念しました(´;ω;`)ウゥゥ
もうこれ以上色々とやっても今の自分のスキルでは乗り越えられないと判断して断念することにしました。
しかし、FILESTREAMという方法ではなく、Sqlserverのデータ型を、varbinary(max) とすれば、Accessでフォームに起こした時に、
ココがポイント
PDFファイルやZipファイルなら保存できる
ことが分かりました。
FILESTREAMは使わずにテーブルに保存に変更
マイクロソフトによると、
保存サイズが1MBより小さく、高速で読込できなくてもいい場合は varbinary(max) データとしてテーブルに保存する方法でも良いらしい。