Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server中的XP\u目录树_Sql Server_Sql Server 2012_File Listing - Fatal编程技术网

Sql server SQL Server中的XP\u目录树

Sql server SQL Server中的XP\u目录树,sql-server,sql-server-2012,file-listing,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列表中 非常感谢您提供的任何帮助或指导,或者以其他方式获取目录和子目录中的文件列表 [编辑]需要注意的两件事是: 确保SQL Serv

对此提出了不同的要求。我用下面的代码搜索本地目录没有问题

EXEC MASTER.sys.xp_dirtree 'C:\', 1, 1
当我将路径切换到网络位置时,结果为空

EXEC MASTER.sys.xp_dirtree '\\Server\Folder', 1, 1
我首先想也许这和权限有关。我将SQL Server服务添加到共享卷和安全组上的ACL列表中

非常感谢您提供的任何帮助或指导,或者以其他方式获取目录和子目录中的文件列表


[编辑]

需要注意的两件事是:

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

    更新 问题最终是O.p.以本地系统帐户的形式运行SQL Server服务。因此,O.P.为SQL Server创建了一个域帐户,将该新域帐户分配为SQL Server服务的登录帐户,并授予该域帐户适当的NTFS权限

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

    这听起来好像已经完成了,所以应该作为该帐户直接登录windows并尝试转到特定的网络路径来测试它

  • 确保正在执行
    xp\u dirtree
    的SQL Server登录名具有“系统管理员”权限:

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

    • 对运行
      xp\u dirtree
      的存储过程进行签名:

      • 在[主机]中创建证书
      • 基于该证书创建登录名
      • 将基于证书的登录添加到
        sysadmin
        服务器角色
      • 备份证书
      • 将证书还原到任何数据库中,该数据库具有或将具有运行
        xp\u dirtree
      • 使用和刚还原的证书对运行
        xp\u dirtree
        的存储过程进行签名
      • 将该存储过程上的EXECUTE授予应执行此操作的用户和/或角色

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

我重新检查了您建议的每一部分。将网络服务添加到ACL(您可能认为可以)中,但我发现它作为本地帐户而不是域帐户运行。我创建了一个新的域帐户以分配给使用的“SQL Server(MSSQLSERVER)”服务。然后授予该帐户网络共享权限。正如我所期望的那样,网络访问现在运行得非常好。您的SQL库看起来也很有希望。干得好@waoonetwork:很高兴这帮你弄明白了。谢谢你发表评论,让我(和其他遇到同样问题的人)知道确切的问题是什么:)。是的,当海报回来发布解决方案时,这总是很有帮助的。当我试图找到一个解决方案时,我遇到了很多帖子,海报上没有报告它是如何修复的。有点让人发疯。哈哈,为什么这个完整的问题被搁置?