SQL FileTableテーブルを使用する場合、CreatedByやLastModifiedByなど、ファイルの追加のメタデータを保存したいと思います。 SQLファイルテーブルスキーマ を見ると、この情報はデフォルトでは利用できません。
たとえば、テーブルにトリガーを追加して current_user を使用して現在のユーザーを特定し、それを別のテーブルに格納することで、このような情報を特定できるかどうか疑問に思っています。
私はプロジェクトでSQL FileTableの実現可能性を調査しており、この技術を使用したことがありません。
代わりにトリガーを使用して問題を解決することができました。
まず、FileTableには固定スキーマがあるため、新しいフィールドは許可されません。 「path_locator」をキーとする1対1の関係でオーサリング情報を格納するための別のテーブルを作成しました。
トリガーを使用して、オーサリング情報を検出して保存することができました。
ファイルをコピー、削除、名前変更する場合、オーサリング情報(作成者、変更者)はsuser_sname()を使用して検出できます。ただし、Word、Excel、メモ帳でドキュメントを編集する場合、suser_sname()がWindows資格情報の資格情報ではなく「dbo」を返すシナリオがあります。これがなぜ発生するのかはわかりませんが、sys.dm_filestream_non_transacted_handlesに参加してそこからユーザー名を取得することで回避しました。以下のコードスニペットを参照してください。
CREATE OR ALTER TRIGGER Authoring_Update ON dbo.DBADocuments AFTER UPDATE AS
BEGIN
IF @@ROWCOUNT = 0 RETURN;
UPDATE dbo.FileMetadataTable SET ModifiedBy = ISNULL(s.login_name, suser_sname())
FROM dbo.FileMetadataTable f
JOIN Inserted i ON i.path_locator = f.PathLocator
LEFT JOIN sys.dm_filestream_non_transacted_handles s ON f.PathLocator = s.item_id
LEFT JOIN dbo.FileTable ft WITH (NOLOCK) ON s.item_id = ft.path_locator
END