【问题标题】:Physical location of FILESTREAM dataFILESTREAM 数据的物理位置
【发布时间】:2011-01-12 02:04:16
【问题描述】:

我怎么知道我刚刚插入 DB 的 FILESTREAM 数据的物理位置(以便我可以在 Windows 资源管理器中看到)路径?

【问题讨论】:

  • 你为什么需要这个?不建议将文件流文件作为常规文件访问。默认情况下,您甚至无法访问这些文件。这就像询问在 mdf 文件中的何处可以找到刚刚插入数据库表中的值。直接(而不是通过提供的 API)篡改文件流文件是破坏数据库的简单方法。

标签: sql-server sql-server-2008 blob 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() 方法的特定连接:

DBCC TRACEON (5556, -1)
GO

【讨论】:

    【解决方案2】:

    我知道这是一篇较旧的帖子,但由于它在 Google 搜索排名中仍然很高,我想我会发布一个答案。当然,在更高版本的 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

    【讨论】:

      【解决方案3】:

      正如 Pawel 所提到的,使用 Windows 资源管理器访问 FILESTREAM 文件不是一个好主意。如果您仍然决心继续探索这一点,以下提示可能会有所帮助。

      FILESTREAM 文件名实际上是创建文件时数据库事务日志中的日志序列号。 Paul Randal 在this post 中对此进行了解释。所以一种选择是找出日志序列号并在文件流数据容器中查找以该序列号命名的文件。

      【讨论】:

        【解决方案4】:

        首先,您需要了解 FileStream 存储在托管 SQL Server 2008 数据库的服务器上。如果您有 DBA,请询问他们在哪里创建了 FileStream。当然,您需要访问服务器的权限才能导航它以查看目录。您也无法以任何方式操作这些文件,但您将能够看到它们。大多数 DBA 不会热衷于让您知道 FileStream 的位置。

        但是,您可以通过其他几种方式到达路径。想到的一种方法是选择 FileStream 字段的 PathName()。假设 FileStream enabled 字段为 ReportData,其所在的表为 TblReports。以下 t-sql 语法将为该位置生成一个 UNC:

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

        我相信你也可以通过企业管理器通过其他方式到达路径,但我现在忘记了如何。

        【讨论】:

          【解决方案5】:

          --filestream文件路径

          SELECT col.PathName() AS path FROM tbl
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-17
            • 1970-01-01
            • 1970-01-01
            • 2016-03-26
            • 1970-01-01
            相关资源
            最近更新 更多