web-dev-qa-db-ja.com

MS SQL FileTable CreatedByおよびLastModifiedBy

SQL FileTableテーブルを使用する場合、CreatedByやLastModifiedByなど、ファイルの追加のメタデータを保存したいと思います。 SQLファイルテーブルスキーマ を見ると、この情報はデフォルトでは利用できません。

たとえば、テーブルにトリガーを追加して current_user を使用して現在のユーザーを特定し、それを別のテーブルに格納することで、このような情報を特定できるかどうか疑問に思っています。

私はプロジェクトでSQL FileTableの実現可能性を調査しており、この技術を使用したことがありません。

3
Henrique Zacchi

代わりにトリガーを使用して問題を解決することができました。

まず、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
1
Henrique Zacchi