2010-02-02 56 views
2

我怎麼能知道我剛插入到數據庫中的FILESTREAM數據的物理位置(所以我可以在Windows資源管理器中看到它)?FILESTREAM數據的物理位置

+0

爲什麼你需要這個?作爲普通文件訪問文件流文件不是推薦的。默認情況下,你甚至無法訪問這些文件。這就像在一個mdf文件中的哪個位置可以找到剛剛插入數據庫表中的值。直接篡改文件流文件(而不是通過提供的API)是破壞數據庫的簡單方法。 – 2010-02-02 23:54:43

回答

0

首先,您需要了解FileStream存儲在承載SQL Server 2008數據庫的服務器上。如果您有DBA,請問他們在哪裏創建了FileStream。當然,您將需要權限到服務器來導航它以查看目錄。您將無法以任何方式操作文件,但您將能夠看到它們。大多數DBA不會熱衷於讓你知道FileStream的位置。

但是,您可以通過其他方式獲取路徑。想到的一種方法是通過選擇FileStream字段的PathName()。假設啓用FileStream的字段是ReportData,並且它所在的表是TblReports。下面的T-SQL語法將產生一個UNC的位置:

select top 1 ReportData.PathName(0) 
from dbo.datReport 

,我相信你也可以在通過企業管理等手段的路徑,但我忘了如何在一瞬間。

2

正如Pawel所述,使用Windows資源管理器訪問FILESTREAM文件不是一個好主意。如果您仍然決定繼續探索,請閱讀以下提示。

FILESTREAM文件名實際上是創建文件時數據庫事務日誌中的日誌序列號。 Paul Randal在this post中解釋過它。因此,一種方法是找出日誌序列號並查找文件流數據容器中以該文件命名的文件。

3

我知道這是一個較舊的帖子,但它仍然出現在谷歌搜索排名高,我想我會發佈一個答案。當然,在SQL的更高版本(我還沒有嘗試這個於2008年),您可以運行下面的查詢:

SELECT  t.name AS 'table', 
      c.name AS 'column', 
      fg.name AS 'filegroup_name', 
      dbf.type_desc AS 'type_description', 
      dbf.physical_name AS 'physical_location' 
FROM  sys.filegroups fg 
INNER JOIN sys.database_files dbf 
ON   fg.data_space_id = dbf.data_space_id 
INNER JOIN sys.tables t 
ON   fg.data_space_id = t.filestream_data_space_id 
INNER JOIN sys.columns c 
ON   t.object_id = c.object_id 
AND   c.is_filestream = 1 

Source

7

有這個一個選項:()方法PhysicalPathName。如果你是SQL Server 2012中或上現在,該代碼會爲你工作:

SELECT stream.PhysicalPathName() AS 'Path' FROM Media 
OPTION (QUERYTRACEON 5556) 

對於SQL Server 2008/2008 R2則需要啓用跟蹤標誌5556爲整個實例:

DBCC TRACEON (5556, -1) 
GO 

或爲特定連接中,您呼叫PhysicalPathName()方法:

DBCC TRACEON (5556, -1) 
GO 
0

--filestream文件路徑

SELECT col.PathName() AS path FROM tbl