Sql server FILESTREAM数据的物理位置
我如何知道刚刚插入数据库的Sql server FILESTREAM数据的物理位置,sql-server,sql-server-2008,blob,filestream,Sql Server,Sql Server 2008,Blob,Filestream,我如何知道刚刚插入数据库的文件流数据的物理位置(以便在Windows资源管理器中看到它)路径?首先,您需要了解文件流存储在承载SQL server 2008数据库的服务器上。如果您有DBA,请询问他们在文件流中创建它的位置。当然,您还需要拥有服务器的权限,才能在服务器上导航以查看目录。您也将无法以任何方式操纵文件,但您将能够看到它们。大多数DBA都不想让您知道文件流的位置 但是,您可以通过其他几种方法找到路径。想到的一种方法是在FileStream字段的PathName()上进行选择。假设启用F
文件流
数据的物理位置(以便在Windows资源管理器中看到它)路径?首先,您需要了解文件流存储在承载SQL server 2008数据库的服务器上。如果您有DBA,请询问他们在文件流中创建它的位置。当然,您还需要拥有服务器的权限,才能在服务器上导航以查看目录。您也将无法以任何方式操纵文件,但您将能够看到它们。大多数DBA都不想让您知道文件流的位置
但是,您可以通过其他几种方法找到路径。想到的一种方法是在FileStream字段的PathName()上进行选择。假设启用FileStream的字段是ReportData,它所在的表是TblReports。以下t-sql语法将为该位置生成UNC:
select top 1 ReportData.PathName(0)
from dbo.datReport
我相信您也可以通过enterprise manager通过其他方式找到路径,但我现在忘记了如何找到路径。正如Pawel提到的,使用Windows资源管理器访问FILESTREAM文件不是一个好主意。如果您仍决心继续探索,以下提示可能会有所帮助
FILESTREAM文件名实际上是创建文件时数据库事务日志中的日志序列号。Paul Randal已经解释过了。因此,一种选择是找出日志序列号,并在文件流数据容器中查找以该序列号命名的文件。我知道这是一篇较老的帖子,但由于它在谷歌搜索排名中仍然排名靠前,我想我应该发布一个答案。当然,在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
此方法有一个选项: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()方法的特定连接:
--文件流文件路径
SELECT col.PathName() AS path FROM tbl
你为什么需要这个?不建议将filestream文件作为常规文件访问。默认情况下,您甚至无权访问这些文件。这就像询问在mdf文件中的何处可以找到刚刚插入到数据库表中的值。直接(而不是通过提供的API)篡改filestream文件是损坏数据库的一种简单方法。
SELECT col.PathName() AS path FROM tbl