SQL Server中的XP_DirTree

时间:2014-11-05 05:04:18

标签: sql-server sql-server-2012 file-listing

已经提出了对此的变化。使用下面的代码搜索本地目录没有问题。

EXEC MASTER.sys.xp_dirtree 'C:\', 1, 1

当我将路径切换到网络位置时,结果为空。

EXEC MASTER.sys.xp_dirtree '\\Server\Folder', 1, 1

我首先想到的可能与权限有关。我将SQL Server服务添加到共享卷和安全组的ACL列表中。

非常感谢任何指导我的帮助或方向,甚至是获取目录和子目录中的文件列表的其他方式。

[被修改]

1 个答案:

答案 0 :(得分:5)

要注意的两件事是:

  • 确保SQL Server服务的登录帐户(通常在服务列表中列为&#34; SQL Server(MSSQLSERVER)&#34;的服务)拥有该网络共享的权限。< / p>

      

    更新

         

    问题最终是O.P.将SQL Server服务作为本地系统帐户运行。因此,O.P。为SQL Server创建了一个域帐户,将该新域帐户指定为SQL Server服务的“登录身份”帐户,并为该域帐户授予了正确的NTFS权限。

         

    请注意,通过将运行SQL Server的服务器本身添加到NTFS权限,同时保持SQL Service作为本地系统帐户运行,这可能也是可以修复的。通常可以通过指定服务器名称后跟美元符号($)来实现。例如:MySqlServer01$。当然,这会为该服务器上作为本地系统帐户运行的所有服务提供NTFS权限,这可能并不理想。因此,仍然最好为SQL Server服务创建一个域帐户来运行(这在任何情况下都是一种很好的做法!)。

    听起来这已经完成,因此应该通过直接登录到该帐户并尝试转到该特定网络路径来测试。

  • 确保正在执行xp_dirtree的SQL Server中的登录具有&#34; sysadmin&#34;权利:

    • 这可以通过将帐户添加到sysadmin服务器角色或

    • 直接完成
    • 签署运行xp_dirtree的存储过程:

      • 在[master]
      • 中创建证书
      • 根据该证书创建登录信息
      • 将基于证书的登录添加到sysadmin服务器角色
      • 备份证书
      • 将证书还原到任何数据库中,或者将具有运行xp_dirtree
      • 的存储过程
      • 使用ADD SIGNATURE和刚刚恢复的证书对运行xp_dirtree的存储过程进行签名
      • 将该存储过程的GRANT EXECUTE执行到应该执行此操作的用户和/或角色。

只是说明了,另一个选择是完全取消xp_dirtree而是使用SQLCLR。各种博客上可能都有样本C#代码。还有一些CodePlex项目具有文件系统功能,也可能为那些不想处理编译的人提供预编译的程序集。而且,还有SQL#库有几个文件系统函数,包括File_GetDirectoryListing,它是一个TVF(意思是:你可以在带有WHERE条件的SELECT语句中使用它,而不是需要转储所有列和首先将所有行放入临时表中)。它也是完全流式的,这意味着它非常快,即使是100k或更多的文件。请注意FILE_*函数仅在完整版本中(即不是免费的),我是SQL#的创建者,但它确实很好地处理了这种情况。