с использованием
call ldaps_search(handle,shandle,filter, attrs, num, rc);
с Microsoft Active Directory я получаю ПРЕДУПРЕЖДЕНИЕ: превышен лимит размера сервера LDAP.
есть ли способ как-то пролистать страницы в sas?
я пробовал ldaps_setOptions
с sizeLimit = 2000, например, но все равно генерирует предупреждение, как я думаю, установлено на стороне Microsoft
Спасибо
образец:
more = 1;
do while (more eq 1);
call ldaps_search_page(handle, shandle, filter, attrs, num, rc, more, 1000);
if rc ne 0 then do;
more = 0;
msg = sysmsg();
put msg;
end;
/* free search results page */
if shandle NE 0 then do;
call ldaps_free(shandle,rc);
end;
end;
Невозможно управлять ограничением размера сервера LDAP со стороны клиента (см. AD MaxPageSize
), но вы все равно можете обойти это с помощью элементы управления пейджингом.
Идея состоит в том, чтобы запросить постраничный результирующий набор с числом записей на странице меньше ограничения сервера MaxPageSize.
SAS предоставляет подпрограмму call ldaps_search_page
, которая возвращает только одну страницу для заданного поискового запроса и требует последующих вызовов для получения всех результатов:
CALL LDAPS_SEARCH_PAGE(lHandle, sHandle, filter, attr, num, rc, more <, pageSize>);
pageSize (optional) specifies a positive integer value, which is the number of results on a page of output. By default, this value is set to 50. If pageSize is 0, this function acts as if paging is turned off. This argument is case-insensitive.
Например, если запрос соответствует результатам н (превышает ограничение на стороне сервера) и размер страницы установлен на 50, вам нужно выполнить до ceil(n/50)
вызовов.
Вот пример, взятый из документа, он использует аргумент more
в цикле для продолжения извлечения результатов с разбивкой по страницам до тех пор, пока не будет больше информации для извлечения:
more = 1;
do while (more eq 1);
call ldaps_search_page(handle, shandle, filter, attrs, num, rc, more, 50);
...
/* free search results page */
if shandle NE 0 then do;
call ldaps_free(shandle,rc);
end;
end;
https://documentation.sas.com/api/docsets/itechdsref/9.4/content/itechdsref.pdf
Для тех, у кого проблемы с more
, застрявшим на 1, что приводит к тому, что приведенный выше код зацикливается навсегда (я не знаю, почему ссылка не будет обновляться, но OP был в этой ситуации), на самом деле вам это не нужно, увеличивая счетчик пока количество извлеченных записей не достигнет число, должно сработать.
Ну .. он остается на 1, как навсегда? Это должно зависеть от num, например num/pageSize дает количество последующих вызовов для выполнения, пока more не станет равным 0 (его следует передавать как ссылку). Что говорят журналы? Вы проверили, что элементы управления пейджингом действительно работают (не полагаясь на SAS, см. Конфигурацию AD напрямую или ldapsearch с использованием параметра -E)?
попробовал dsquery и paging, работающие нормально, только что прошел код в отладчике, в тестовом подразделении, которое, как я знаю, имеет 404 объекта, если я установлю ограничение на 100 и запущу, я увижу увеличение shandle и число, возвращающее 4 лота или 100 и один много или 4, но больше остается 1, то на 6-м он кажется перезагружается, и я получаю 4 100 и 1 4 снова навсегда. так что похоже, что пейджинг работает, но просто больше не обновляется до не 1? Спасибо
Да, это странно... если больше не обновляется, просто увеличивайте счетчик, пока количество извлеченных записей не достигнет число.
coolio, я устанавливаю num на 1000 перед do, затем устанавливаю do, пока num = 1000, затем, когда окончательные результаты приходят в num <> 1000 больше, и выхожу из do :)
привет, попробовал с вашим предложением (добавлен пример кода к вопросу выше), но больше по-прежнему остается равным 1, поэтому никогда не выходит из цикла?