SQL Server中的XP_DirTree

wao*_*ork 8 sql-server file-listing sql-server-2012

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

EXEC MASTER.sys.xp_dirtree 'C:\', 1, 1
Run Code Online (Sandbox Code Playgroud)

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

EXEC MASTER.sys.xp_dirtree '\\Server\Folder', 1, 1
Run Code Online (Sandbox Code Playgroud)

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

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

将帖子

Sol*_*zky 6

要注意的两件事是:

  • 确保SQL Server服务的登录帐户(服务列表中通常列为"SQL Server(MSSQLSERVER)"的服务)具有该网络共享的权限.

    UPDATE

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

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

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

  • 确保正在执行的SQL Server中的登录xp_dirtree具有"sysadmin"权限:

    • 这可以通过将帐户添加到sysadmin服务器角色来直接完成,或

    • 签署运行的存储过程xp_dirtree:

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

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

  • 是的,当海报回来发布解决方案时,这总是有用的.我试图找到一个解决方案时遇到了很多帖子,海报没有报告它是如何修复的.一种人疯狂的驱动器.哈哈 (3认同)