2010-02-02 73 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