【问题标题】:SQL 2005 Linked Server Query Periodically FailingSQL 2005 链接服务器查询定期失败
【发布时间】:2009-01-28 00:04:38
【问题描述】:

我们有一个在 SQL 2005 上运行的数据库。其中一个存储过程使用链接服务器从 Active Directory 中查找用户的电子邮件地址。对链接服务器的调用发生在数据库函数中。

我第一次可以从我的 Asp.Net 应用程序成功调用,但之后会定期失败并出现以下错误:

{“无法执行请求的操作,因为链接服务器“ADSI”的 OLE DB 提供程序“ADsDSOObject”不支持所需的事务接口。”}

似乎调用函数之间的时间量会影响链接服务器查询是否能正常工作。我没有使用任何交易。当我尝试在快速临时 SQL 脚本中调用该函数时,它每次都运行良好(即使在快速连续测试时也是如此)。

如果我不尝试再次调用该过程,是否有某种交易处于打开状态而自然死亡?我在这里不知所措。

这是存储过程中的简单调用:

DECLARE @email varchar(50)


SELECT @email = LEFT(mail, 50)
FROM OPENQUERY (
    ADSI,
    'SELECT mail, sAMAccountName FROM ''LDAP://DC=Katz,DC=COM'' WHERE objectCategory = ''Person'' AND objectClass = ''User'''
)
WHERE sAMAccountName = CAST(@LoginName AS varchar(35))

RETURN @email

【问题讨论】:

    标签: sql sql-server-2005 active-directory linked-server


    【解决方案1】:

    我经常使用 SQL Server 链接服务器,虽然很少使用 LDAP 查询...但我很好奇并阅读了 Ric Tokyo 上一篇文章中链接到的 Microsoft 支持页面。底部写着:

    这是典型的目录服务器 对服务器实施服务器限制 将成为的对象数 为给定查询返回。这是为了 防止拒绝服务攻击和 网络过载。正确查询 目录服务器,大型查询 应该分解成许多更小的 那些。一种方法是通过 称为分页的过程。虽然分页是 可通过 ADSI 的 OLEDB 提供者,目前没有办法 可从 SQL 执行它 分布式查询。这意味着 对象总数 查询返回的是服务器 限制。在 Windows 2000 活动 目录,默认服务器限制为 1,000 个对象。

    我认为它失败的原因(或没有)取决于是从应用程序还是从“快速临时 sql 脚本”(如您所说)调用它,这可能与安全上下文有关在其下执行操作。根据链接服务器连接的设置方式,可能会在各种可能的凭据下执行操作,具体取决于您启动查询的方式。

    我不知道,但这是我最好的猜测。我会查看链接服务器配置,特别是链接服务器设置,哪些凭据集用作跨链接服务器执行的操作运行的安全上下文。

    【讨论】:

    • 我的 LDAP 查询一次只返回 1 个对象,所以我认为返回对象的数量不是问题。我可以查看安全上下文,但我有点怀疑,因为有时它有效,有时则无效。但自始至终,安全上下文保持不变。
    【解决方案2】:

    与其通过链接服务器查询 Active Directory,不如将 AD 数据缓存到 SQL 数据库中,然后进行查询。您可以通过使用“用于 Microsoft 目录服务的 OLE DB PROvider”创建 OLE DB 连接并使用带有如下查询的 DataReader 源来使用集成服务:

        SELECT physicalDeliveryOfficeName, department, company, title, displayName, SN, 
        givenName, sAMAccountName, manager, mail, telephoneNumber, mobile  
        FROM 'LDAP://DC=SOMECO,DC=COM' 
        WHERE objectClass='User'  and objectCategory = 'Person' 
        order by mail 
    

    使用此方法,您仍然会遇到 AD 查询结果的 1000 行限制(请注意,尝试在 AD 中增加此限制是不可取的,它可以防止域控制器过载)。有时可以使用查询组合来返回完整的数据集,例如名称 A - L 和 M - Z

    或者,您可以使用 Windows Server 中的 CSVDE 命令行实用程序将目录信息导出到 CSV 文件,然后将其导入 SQL 数据库(有关使用 CSVDE 导出 AD 数据的更多信息,请参阅http://computerperformance.co.uk/Logon/Logon_CSVDE_Export.htm)。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        我怀疑它可能是缓存的查询计划,因为您说“当我尝试在快速临时 SQL 脚本中调用该函数时,它每次都运行良好(即使是在快速连续测试时)。”

        您可以尝试像这样执行您的存储过程吗:

        EXEC usp_MyProcedure WITH RECOMPILE
        

        【讨论】:

          【解决方案5】:

          当搜索错误字符串但没有有效答案时,这个问题出现在第一个谷歌页面的顶部。

          当没有在 .NET 代码和存储过程中指定隔离级别时,此错误会间歇性发生。

          此错误也发生在 SQL Server 2008 中。

          修复是强制 SET TRANSACTION ISOLATION LEVEL READ (UN)COMMITTED,因为 Active Directory 不支持更高的隔离级别,并且 SQL Server 正在尝试使用 SERIALIZABLE

          现在,因为此错误是间歇性的。为什么 ADO.NET 或 SQLServer 有时将其默认隔离切换为SERIALIZABLE,有时则不?是什么触发了这种切换?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-08
            • 2013-08-08
            • 1970-01-01
            • 2021-04-28
            • 2019-09-29
            • 2011-05-04
            相关资源
            最近更新 更多