我有两台服务器 A 和 B。B 是数据库服务器,A(此处)是数据库服务器的客户端。在服务器 A 上运行的工具连接到服务器 B 上的 SQL Server,并最终触发从服务器 A 上的共享(\\servera\fileshare)批量导入。
服务器 A 上的工具以 localsystem 身份运行。domain\servera$ 具有对服务器 B 上的 SQL Server 所需的访问权限。
问题是服务器 B 上的 SQL Server 无法访问 \\servera\fileshare,尽管 SQL 服务帐户拥有执行此操作的所有权限(在服务器 A 上)。我发现这是因为 SQL Server 尝试将连接委托给实用程序用于连接 SQL Server 的帐户,但失败了,因为 SQL Server 服务帐户没有委托的权限(我无法更改该设置)。
我还发现,如果我使用 SQL 帐户(即不是 Active Directory 帐户)通过 SQL 身份验证(而不是 Windows 身份验证)进行连接,SQL Server 将使用 SQL Server 服务帐户连接到文件共享,并且一切正常。幸运的是,该工具支持使用 SQL 帐户。不幸的是,密码以纯文本形式作为命令行参数给出,然后出现在所有其他参数的进程列表中。这不好。
有没有办法让 SQL Server 在连接文件共享时使用自己的服务帐户,而无需使用 SQL 帐户连接 SQL Server?
这是 Windows Server 2003 上的 SQL Server 2008。
答案1
不幸的是,你所看到的行为是设计使然:
http://msdn.microsoft.com/en-us/library/ms188365.aspx [安全账户委托(模拟)] http://msdn.microsoft.com/en-us/library/ms175915.aspx 【安全注意事项】 http://msdn.microsoft.com/en-us/library/ms161965.aspx
来自第二个链接:
SQL Server 2005 及更高版本控制文件访问的方式解决了 Microsoft SQL Server 2000 及更早版本中存在的安全问题。以前,在用户经过身份验证后,对外部文件的访问取决于 SQL Server 进程的安全配置文件。当 SQL Server 进程具有对文件的读取权限时,对于无权访问该文件但属于 bulkadmin 固定服务器角色成员的用户,该用户可以使用 BULK INSERT 导入该文件并访问该文件的内容。
您唯一的选择是使用 SQL Server 登录或授予 SQL Server 执行委派所需的权限。
一种可能的解决方案是运行一项作业,将文件从 ServerA 复制到 ServerB(我假设您的服务帐户对它们两个都有写权限),然后让 ServerB 上的 SQL Server 从其本地磁盘执行导入。
答案2
您可以将 Windows 登录信息映射到凭据有权访问:
create credential [...] with identity='domain\user', secret='domainpassword';
alter login [...] with credential=[...];
但要小心,不要在 SQL 凭据存储中复制 AD。并且您需要设计一种方法来使 SQL Server 凭据数据库与 AD 保持同步(密码更改等)。
答案3
从 SQL Server 代理将其作为作业运行