代码之家  ›  专栏  ›  技术社区  ›  anschoewe

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

  •  4
  • anschoewe  · 技术社区  · 16 年前

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

    我可以第一次成功地从我的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 回复  |  直到 9 年前
        1
  •  3
  •   codemonkey    16 年前

    我经常使用sql server链接服务器,虽然很少使用ldap查询…但我很好奇,并阅读了微软支持页面链接到RICC东京的前一篇文章。下面写着:

    对于目录服务器来说,这是典型的 对 将要 为给定查询返回。这是为了 防止拒绝服务攻击和 网络过载。正确查询 目录服务器,大型查询 应该分成很多更小的 那些。一种方法是通过 进程调用了分页。当分页是 通过ADSI的OLEDB提供 提供者,目前没有办法 可从SQL执行 分布式查询。这意味着 可以是对象的总数 返回的查询是服务器 极限。在Windows 2000中处于活动状态 目录,默认服务器限制为 1000个物体。

    我认为它失败的原因取决于是从应用程序调用它还是从“快速转换SQL脚本”(如您所说)调用它,可能与执行操作的安全上下文有关。取决于如何建立链接服务器连接,可以根据各种可能的凭据执行操作,这取决于您如何启动查询。

    我不知道,但这是我最好的猜测。我将查看linkserver配置,特别是linkserver设置,该设置将哪些凭据集用作运行在linkserver上的操作的安全上下文。

        2
  •  2
  •   Nathan Griffiths    16 年前

    与其通过链接服务器查询active directory,不如将广告数据缓存到sql数据库中,然后查询它。您可以使用Integration Services,方法是使用“用于Microsoft目录服务的OLE DB提供程序”创建OLE DB连接,并使用具有以下查询的数据读取器源:

        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服务器中的csvde命令行实用程序将目录信息导出到csv文件,然后将其导入到sql数据库(请参见 http://computerperformance.co.uk/Logon/Logon_CSVDE_Export.htm 有关使用csvde导出广告数据的更多信息)。

        3
  •  1
  •   Ric Tokyo    16 年前
        4
  •  1
  •   Mitch Wheat    16 年前

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

    你能试着像这样执行你的存储过程吗?

    EXEC usp_MyProcedure WITH RECOMPILE
    
        5
  •  0
  •   jlvaquero    9 年前

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

    如果未在.NET代码或存储过程中指定隔离级别,则会间歇性发生此错误。

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

    解决之道是武力 SET TRANSACTION ISOLATION LEVEL READ (UN)COMMITTED 因为active directory不支持更高的隔离级别,并且sql server正在尝试使用 SERIALIZABLE .

    现在,因为这个错误是间歇性的。为什么ado.net或sqlserver将其默认隔离切换为 可串行化的 有时,有时不是?是什么触发了这种转换?

    推荐文章