2009-01-28 5 views
4

У нас есть база данных, работающая на SQL 2005. Одна из процедур магазина просматривает адрес электронной почты пользователя из Active Directory с помощью связанного сервера. Вызов связанного сервера происходит в функции базы данных.SQL Server Linked Server Query Периодически сбой

Я могу назвать это успешно от моего Asp.Net приложения в первый раз, но периодически после этого, он не со следующей ошибкой:

{ "Запрошенная операция не может быть выполнена, так как OLE DB провайдер \ "ADsDSOObject \" для связанного сервера \ "ADSI \" не поддерживает требуемый интерфейс транзакции. "}

Похоже, что время между вызовом функции влияет на то, будет ли запрос связанного сервера работать правильно. Я не использую никаких транзакций. Когда я пытаюсь вызвать функцию в быстром скрипте 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 

ответ

3

Я работал с linkservers SQL Server часто, хотя и редко LDAP запросов ... но мне было любопытно, и прочитайте страницу поддержки Microsoft, связанную с предыдущим сообщением Рика Токио. К нижней части гласит:

It is typical for a directory server to enforce a server limitation on the number of objects that will be returned for a given query. This is to prevent denial-of-service attacks and network overloading. To properly query the directory server, large queries should be broken up into many smaller ones. One way to do this is through a process called paging. While paging is available through ADSI's OLEDB provider, there is currently no way available to perform it from a SQL distributed query. This means that the total number of objects that can be returned for a query is the server limit. In the Windows 2000 Active Directory, the default server limit is 1,000 objects.

Я думаю, что причина, он не будет работать на вас (или нет), в зависимости от того, вызвать его из приложения или из «быстрого импровизированных сценария SQL» (как вы) может быть связано с контекстом безопасности, под которым выполняется операция. В зависимости от того, как было настроено соединение с сервером ссылок, операция может выполняться под различными возможными учетными данными в зависимости от того, как вы инициируете запрос.

Я не знаю, но это мое лучшее предположение. Я бы посмотрел на конфигурацию сервера ссылок, в частности на настройки сервера ссылок, для которых набор учетных данных используется в качестве контекста безопасности, под которым выполняются операции, выполняемые во время работы сервера ссылок.

+0

Мои запросы LDAP возвращают только 1 объект за раз, поэтому я не думаю, что количество возвращенных объектов является проблемой. Я могу посмотреть на контекст безопасности, но я немного сомневаюсь, потому что иногда он работает, а иногда и нет. Но все время контекст безопасности остается прежним. – anschoewe

2

Вместо того, чтобы запрашивать Active Directory через связанный сервер, возможно, вам лучше кэшировать данные AD в базу данных SQL, а затем запросить это вместо этого. Вы можете использовать Integration Services, создав соединение OLE DB с помощью «OLE DB Provider для Microsoft Directory Services» и имеющий источник 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 

Используя этот метод, вы по-прежнему работать в пределе 1000 строк для получения результатов из запроса AD (обратите внимание, что не рекомендуется пытаться увеличить этот предел в AD, он должен предотвратить перегрузку контроллера домена). Иногда его можно использовать комбинацию запросов для возврата полного набора данных, например. имена A - L и M - Z

В качестве альтернативы вы можете использовать утилиту командной строки CSVDE в Windows Server для экспорта информации о вашем каталоге в файл CSV, а затем импортировать его в базу данных SQL (см. http://computerperformance.co.uk/Logon/Logon_CSVDE_Export.htm для получения дополнительной информации об экспорте AD данные с CSVDE).

1

Я подозреваю, что это может быть план кешированных запросов из-за вашего утверждения: «Когда я пытаюсь вызвать функцию в быстром скрипте SQL-скрипта, он отлично работает каждый раз (даже при быстром тестировании)."

Не могли бы вы попробовать выполнение хранимой процедуры следующим образом:.

EXEC usp_MyProcedure WITH RECOMPILE 
0

Этот вопрос появляется в верхней части первой страницы Google, когда поиск строки ошибки, но не имеет правильный ответ

Этот ошибка происходит intermitently, когда уровень изоляции не указан в коде .NET, ни в процедуре Store.

Эта ошибка также происходит в SQL Server 2008.

Исправление - это сила SET TRANSACTION ISOLATION LEVEL READ (UN)COMMITTED, потому что уровень изоляции любого уровня выше не поддерживается Active Directory, и SQL Server пытается использовать SERIALIZABLE.

Теперь, поскольку эта ошибка является промежуточной. Почему ADO.NET или SQLServer переключает свою стандартную изоляцию на SERIALIZABLE, иногда, а иногда нет? Что вызывает это переключение?