我们在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
答案 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
,有时不会?什么触发了这种转变?