10

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

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

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

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

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

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

[已编辑]

4

1 回答 1

8

需要注意的两件事是:

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

    更新

    问题最终是 OP 将 SQL Server 服务作为本地系统帐户运行。因此,OP 为 SQL Server 创建了一个域帐户,将该新域帐户分配为 SQL Server 服务的登录身份帐户,并授予该域帐户适当的 NTFS 权限。

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

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

  • 确保正在执行的 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_GetDirectoryListing哪个是 TVF(意思是:您可以在带有 WHERE 条件的 SELECT 语句中使用它,而不需要先将所有列和所有行转储到临时表中) . 它也是完全流式传输的,这意味着它非常快,即使对于 100k 或更多文件也是如此。请注意,FILE_*函数只有完整版(即不是免费的),我是 SQL# 的创建者,但它确实很好地处理了这种情况。

于 2014-11-05T19:57:01.747 回答