SQL 2005链接服务器查询定期失败

时间:2009-01-28 00:04:38

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

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

我能够第一次从我的Asp.Net应用程序成功调用,但在此之后,它会在以下错误中失败并显示错误:

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

调用函数之间的时间量似乎会影响链接服务器查询是否正常工作。我没有使用任何交易。当我尝试在快速的make-shift 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

5 个答案:

答案 0 :(得分:3)

我经常使用SQL Server链接服务器,虽然很少使用LDAP查询......但我很好奇并阅读了链接到Ric Tokyo之前帖子的Microsoft支持页面。它的底部是:

  

通常是目录服务器   强制执行服务器限制   将要的对象数量   为给定的查询返回。这是为了   防止拒绝服务攻击和   网络重载。要正确查询   目录服务器,大型查询   应该分解成许多小的   那些。一种方法是通过a   进程称为分页。虽然分页是   可通过ADSI的OLEDB获得   提供者,目前没办法   可以从SQL执行它   分布式查询。这意味着   可以的对象总数   返回查询是服务器   限制。在Windows 2000 Active中   目录,默认服务器限制是   1,000件物品。

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

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

答案 1 :(得分:2)

而不是通过链接服务器查询Active Directory,最好将AD数据缓存到SQL数据库中,然后再查询它。您可以通过使用“OLE DB PRovider for Microsoft Directory Services”创建OLE DB连接并使用带有以下查询的DataReader源来使用Integration Services:

    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)。

答案 2 :(得分:1)

答案 3 :(得分:1)

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

您可以尝试执行存储过程,如下所示:

EXEC usp_MyProcedure WITH RECOMPILE

答案 4 :(得分:0)

当搜索错误字符串但没有有效答案时,此问题会显示在第一个Google页面的顶部。

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

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

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

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