[鐵人賽][Denali 新特性探險15]FileTables(3)
前兩篇我大概說明 FileTable 功能和特性,同時也示範該如何建立FileTable,
並且也驗證 FileTable和Windows 檔案管理兩者的同步,
接下來,我將介紹 FileTable 管理及相關函數。
管理相關
開啟或關閉 File namespace
--開啟
alter table dbo.ftsmp3 enable filetable_namespace
--關閉
alter table dbo.ftsmp3 disable filetable_namespace
如果沒開啟Filetable_Namespace,
當要透過Windows檔案系統存取FileTable就會發生無法開啟檔案位置錯誤(如下圖)。
取得開啟操作中的檔案清單
透過新增的 sys.dm_filestream_non_transacted_handles(DMV)來取得開啟中的檔案清單。
select t1.handle_id,t1.file_object_type_desc,t1.state ,t1.state_desc,t1.open_time,t1.opened_file_name
from sys.dm_filestream_non_transacted_handles t1
確認FileTables Locks
透過dm_filestream_non_transacted_handles join sys.dm_tran_locks來確認Locks。
select opened_file_name
from sys.dm_filestream_non_transacted_handles
where fcb_id IN
( select request_owner_id from sys.dm_tran_locks );
開啟中的檔案可能會產生資源獨佔,這將會導致其他人無法修改該檔案,
所以必要時,你可能會刪除開啟中的檔案,好釋放相關獨佔資源。
刪除操作
-- 刪除所有 Filetables 已開啟操作
exec sp_kill_filestream_non_transacted_handles;
--刪除單一FileTable中所有開啟中的操作
exec sp_kill_filestream_non_transacted_handles @table_name = 'filetabletest';
-- 刪除單一開啟操作.
exec sp_kill_filestream_non_transacted_handles @handle_id = 1167;
刪除開啟中的檔案。
相關系統函數介紹
FileTableRootPath:返回目前資料庫或特定 FileTable root-level UNC路徑。
--返回目前資料庫 root-level UNC 路徑
select FileTableRootPath();
--返回目前資料庫某個 FileTable root-level UNC 路徑|
select FileTableRootPath(N'dbo.ftsmp3');
GetFileNamespacePath:返回 FileTable中特定檔案或目錄 UNC 路徑。
--default
select file_stream.GetFileNamespacePath() as FilePath
FROM ftsmp3
where Name = '123.txt';
--完整 UNC 路徑
select file_stream.GetFileNamespacePath(1) as FullFilePath
FROM ftsmp3
where Name = '123.txt';
GetPathLocator:返回FileTable中特定檔案或目錄 path_locator_id 。
下面兩個方法均可取得特定目錄或檔案的 path_locator_id。
方法1
select file_stream,name,path_locator
from ftsmp3
方法2
select GetPathLocator(file_stream.GetFileNamespacePath(1)) as '123.txt path_locator_id'
FROM ftsmp3
where Name = '123.txt';