(我在 MS 工作,我支持 SQL ML 服务)
您的问题的简短答案是 -
您将很难在 ML 服务中访问 UNC 路径。这在技术上是可行的,但复杂性使得它对许多人来说是不可行的。您没有显示您的代码或错误,但我可以向您保证,您的问题与 pandas 无关,并且您可能会收到关于无法“连接”的错误,因为我们默认禁用来自 ML 服务的出站网络流量。 .. 但如果你通过了,那么你可能会遇到身份验证错误。
你的问题的长答案是 -
SQL 2016 和 2017 - 我们使用本地“工人”帐户。默认名称(它们基于您的实例名称)是 MSSQLSERVER01,02,03...20。(默认有 20 个...还有一个 MSSQLSERVER00,但我们将忽略那个)。
Launchpad 服务由它的服务帐户(默认:NT Service\MSSQLLaunchpad)运行,它可以作为域帐户运行。但是,实际执行 R/Python 代码的并不是启动板。 Launchpad 启动 R 进程,并在 MSSQLSERVERXX 用户下执行此操作。正是那个用户在技术上运行您的代码,因此,是那个用户试图连接到您的 UNC 路径,而不是您登录 SQL 的用户。此用户是本地用户 - 无法跨 UNC 共享进行身份验证。这个问题归结为设计限制。
在 Windows 中,无法在您的 UNC 路径中提供用户名/密码(而在 Linux 中,您可以)。使用映射驱动器将不起作用,因为它们是本地到您的用户和登录会话。因此,其他用户(以及 MSSQLSERVERXX 用户)将无法访问一个登录用户的映射驱动器。
简而言之,如果您绝对想让它工作,则必须完全在您的网络共享上禁用身份验证。在 Windows 中,这不仅仅是向文件添加“EVERYONE”权限。您还必须允许 GUEST(或在 *nix 世界中,ANONYMOUS)访问文件共享。在所有最近的 Windows 版本中默认禁用此功能,您必须修改各种 gpos/注册表设置/等以允许这样做。这不是我的建议。
如果这是在 AD 环境中,理论上您还可以允许 SQL 主机的 COMPUTER 帐户,以便允许来自“计算机”的所有连接。同样,不太理想。
在 SQL 2019 中 - 我们摆脱了本地用户帐户,转而使用 appcontainers。这消除了对本地用户帐户的需求(大型组织中的许多客户对本地用户帐户有限制),并提供了额外的安全性,但与往常一样,更多的安全性会带来更多的复杂性。在这种情况下,如果您以域用户身份运行启动板服务,您的 R/Python 进程将作为 LAUNCHPAD 帐户执行(但在非常锁定的应用容器上下文中)。从理论上讲,您可以随后授予 AD 中的该服务帐户访问您的远程 UNC 共享的权限……但是,appcontainers 提供了对特定“权限”(而不是文件级权限)的更精细的控制。例如,至少在概念上,当您在手机上使用应用程序时,或者可能是 Windows 商店 UWP 应用程序时,它会询问“您是否要允许它访问您的相机?” - 这些权限层是 appcontainers 的东西可以提供。我们必须明确声明个人“能力”,并且由于我们必须首先考虑和解决的其他几个安全隐患,我们目前不声明访问 UNC 共享的能力。这也是目前的设计限制。
SQL 2016/2017 的上述可能性不适用于 SQL 2019,也将不起作用。
但是,对于所有人来说,虽然它可能并不理想,但我的建议和您的最佳选择是:
- 重新考虑您正在执行此操作的方向。不要使用您的 SPEES (sp_execute_external_scripts) 代码来访问网络共享,而是考虑从 SQL 主机本身共享一个目录......这样,您至少不必允许 GUEST 访问,并且可以保留一定级别的权限.然后,您可以将所需的任何文件拖放到共享中,然后通过 SPEES 代码中的本地到该主机的路径(例如:C:\SQL_ML_SHARE\file.xel)访问它。