4

SQL 2005で実行されているデータベースがあります。ストアドプロシージャの1つは、リンクサーバーを使用してActiveDirectoryからユーザーの電子メールアドレスを検索します。リンクサーバーへの呼び出しは、データベース関数で発生します。

初めてAsp.Netアプリケーションから正常に呼び出すことができますが、その後定期的に次のエラーで失敗します。

{"リンクサーバー\"ADSI\"のOLEDBプロバイダー\"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 サポート ページを読みました。一番下に向かって、次のように書かれています。

特定のクエリに対して返されるオブジェクトの数に対して、ディレクトリ サーバーがサーバー制限を適用するのが一般的です。これは、サービス拒否攻撃とネットワークの過負荷を防ぐためです。ディレクトリ サーバーに適切にクエリを実行するには、大きなクエリを多数の小さなクエリに分割する必要があります。これを行う 1 つの方法は、ページングと呼ばれるプロセスを使用することです。ページングは​​ ADSI の OLEDB プロバイダーを通じて利用できますが、現在、SQL 分散クエリからページングを実行する方法はありません。これは、クエリに対して返すことができるオブジェクトの総数がサーバーの制限であることを意味します。Windows 2000 Active Directory では、既定のサーバー制限は 1,000 オブジェクトです。

アプリから呼び出すか、「クイックメイクシフトSQLスクリプト」(あなたが言うように)から呼び出すかに応じて、失敗する(または失敗する)理由は、セキュリティコンテキストに関連している可能性があると考えています操作を実行しています。リンク サーバー接続の設定方法によっては、クエリの開始方法に応じて、さまざまな資格情報で操作が実行される可能性があります。

わかりませんが、それが私の最善の推測です。リンクサーバーの構成、特に、リンクサーバー全体で実行される操作が実行されるセキュリティコンテキストとして使用される資格情報のセットに関するリンクサーバーの設定を確認します。

于 2009-01-28T01:52:24.463 に答える
1

Microsoft のサポート ページをお読みください。

于 2009-01-28T00:46:47.467 に答える
1

「簡単な一時的なSQLスクリプトで関数を呼び出すと、毎回正常に実行されます(すばやく連続してテストした場合でも)」というステートメントが原因で、キャッシュされたクエリプランである可能性があります。

次のようにストアド プロシージャを実行してみてください。

EXEC usp_MyProcedure WITH RECOMPILE
于 2009-03-10T02:27:00.163 に答える