在 SqlServer 2000 上,我创建了一个到 SqlServer 2005 机器的链接服务器,其中“服务器类型”设置为“SQL Server”(第一个单选按钮),并且链接服务器名称设置为远程机器的主机名。
但是 SqlServer 2000 只能看到 2005 服务器上的众多目录之一。我可以顺利地从该目录中的表中进行 SELECT,但无法访问同一 2005 服务器上的任何其他目录。
我可以查找哪些设置来找出发生这种情况的原因,或者 SqlServer 2000 在链接服务器上可以看到的目录数量是否有限制?
答案1
您需要编辑链接服务器的安全设置,以指定 SQL 2005 实例上的登录名,该登录名具有您希望通过链接服务器访问的所有目录的权限。我手边没有 SQL 2000 服务器,无法为您提供确切的步骤,但这里有一篇 MSDN 文章描述了如何为 SQL 2000 链接服务器建立安全性。
编辑:
请参阅 SQL Server Central 上的这篇文章配置 Kerberos 身份验证以便允许链接服务器使用当前登录用户的凭据来对目标服务器进行身份验证。另请参阅我的问题的答案为 SQL Server 设置信任委托。
答案2
您之所以收到此问题,是因为您的 Kerberos 只配置了一半。您遇到了双跳问题。过去几天,我学到了一些有关设置链接服务器的知识。此文档关于 '如何使用 SQL Server 2008 实现 Kerberos 约束委派' 对我帮助最大。
以下是有关使用集成安全性与链接服务器的一些关键点(即 - “使用登录的当前安全上下文进行”)
- 您的 Windows 帐户必须有权访问 ServerA 和 ServerB。
- 服务器必须使用 TCP/IP 或命名管道
- ServerA 和 ServerB 都必须注册自己的 SPN。
- 如果没有,您可能会看到用户 ANONYMOUS 登录失败的错误。
- 使用短名称时,必须将其解析为具有 Active Directory 域名的 FQDN。如果您输入短名称,而它解析为除您的 AD 域名之外的任何其他域名,则似乎会中断。作为替代方案,请在指向您的 AD 域名的辅助域中使用 CNAME。
- 检查 SPN:setspn-l 域\SQL_Engine_Svc_Account
- 设置 SPN:我不能 100% 确定所有这些条目都是必要的,但我添加这些条目是为了涵盖客户端可能连接到实例的所有不同方式。 警告!这些 SPN 区分大小写!。设置 SPN 后必须重置实例。您可以让引擎自动注册这些,但就我的情况而言,使用 dns 别名,它永远无法正确注册。
- 基本语法:setspn -A MSSQLSvc/SQLHOSTNAME[FQDN][:端口][:实例]
- 默认实例:
- setspn -A MSSQLSvc/主机名域\SQL_Engine_Svc_Account
- setspn -A MSSQLSvc/主机名:1433 域\SQL_Engine_Svc_Account
- setspn -A MSSQLSvc/HOSTNAME.DOMAIN.ORG 域\SQL_Engine_Svc_Account
- setspn -A MSSQLSvc/HOSTNAME.DOMAIN.ORG:1433 DOMAIN\SQL_Engine_Svc_Account
- 命名实例:
- setspn -A MSSQLSvc/主机名:实例名称域\SQL_Engine_Svc_Account
- setspn -A MSSQLSvc/HOSTNAME.AD.ORG:实例名称域\SQL_Engine_Svc_Account
- 具有 DNS 别名的命名实例:(我们使用与实际主机名不同的 DNS 别名。)
- setspn -A MSSQLSvc/别名域\SQL_Engine_Svc_Account
- setspn -A MSSQLSvc/ALIAS:1433 域\SQL_Engine_Svc_Account
- setspn -A MSSQLSvc/ALIAS:实例名称域\SQL_Engine_Svc_Account
- setspn -A MSSQLSvc/ALIAS.DOMAIN.ORG:1433 DOMAIN\SQL_Engine_Svc_Account
- setspn -A MSSQLSvc/ALIAS.DOMAIN.ORG:1433 DOMAIN\SQL_Engine_Svc_Account
- setspn -A MSSQLSvc/ALIAS.DOMAIN.ORG:实例名称域\SQL_Engine_Svc_Account
- sql引擎账户不能有“账户敏感,不能委托”的设置。
- 配置双跳链接服务器连接时必须配置委派:
- 在活动目录用户和计算机中,找到 SQLServerA 引擎服务的服务帐户(假设您正在使用帐户 - 否则请查找计算机帐户。)在委派选项卡下,选择“仅信任此用户委派指定服务”和“仅使用 Kerberos”单击添加按钮。找到 SQLServerB 引擎服务的服务帐户。选择您之前配置的与您尝试创建的链接服务器相关的 SPN。
答案3
我刚刚做完!
用于将所有服务器相互链接的远程登录 ID 必须具有对数据库的读/写访问权限。
一旦您授予数据库的读写权限,数据库就会显示在链接服务器下的目录列表中。
转到每个数据库 > 安全 > 用户并找到远程登录。如果不存在,请转到服务器级别 > 安全 > 用户 > 用户映射并检查要链接的数据库。现在,通过转到数据库 > 安全 > 用户 > 拥有的架构检查 db_datareader 和/或 db_datawriter,确保远程登录具有读/写权限。
祝你好运!
贾维德