4

我们有一个在 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
4

5 回答 5

3

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

目录服务器通常会对给定查询返回的对象数量实施服务器限制。这是为了防止拒绝服务攻击和网络过载。要正确查询目录服务器,应该将大型查询分解为许多较小的查询。一种方法是通过称为分页的过程。虽然可以通过 ADSI 的 OLEDB 提供程序进行分页,但目前无法从 SQL 分布式查询中执行它。这意味着可以为查询返回的对象总数是服务器限制。在 Windows 2000 Active Directory 中,默认服务器限制为 1,000 个对象。

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

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

于 2009-01-28T01:52:24.463 回答
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 数据库(有关更多信息,请参见http://computerperformance.co.uk/Logon/Logon_CSVDE_Export.htm使用 CSVDE 导出 AD 数据)。

于 2009-01-29T00:57:35.823 回答
1

I suspect that it might be the cached query plan due to your statement that "When I try calling the function in a quick make-shift SQL script, it runs fine everytime (even when tested in quick succession)."

Could you try executing your stored procedure like so:

EXEC usp_MyProcedure WITH RECOMPILE
于 2009-03-10T02:27:00.163 回答
1

请阅读Microsoft 的支持页面

于 2009-01-28T00:46:47.467 回答
0

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

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

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

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

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

于 2016-02-03T12:08:13.927 回答