Как стать автором
Обновить

Комментарии 7

Не совсем понял что есть
foreach (SearchResult se in srch.FindAll())
{
}
в GetSyncData может туплю после тяжкого дня, не мне непонятно.
Как я вижу база у вас небольшая, триггерами еще пользуетесь :)
Перепишите на хранимки лучше - так и логика и управляемость кода будут гораздо выше.
PS а чем раскрашивали код? Если не секрет?
Объясню :)
долго очень пытался понять, в чём проблема, пока не прочёл внимательно строку что result should be enumerated. вообще, можно просто сделать srch.FindAll(), а потом проверить count на 0. суть в том же. snippet старый) забыл переписать, если честно)))

бд.. у нас в принципе не оч большая)) 25тыс пользователей в AD + порядка 1000 OU. а роли я не храню в БД.

на предмет хранимок не совсем понял, что имеете ввиду) с удовольствием перепишу, если поясните..

код раскрашивал по рекоммендациям храбра source code highliter, http://source.virtser.net/.
В смысле insert/update вынести на уровень БД.
Если все правильно понял пользуетесь MS SQL Server? Я в нем не силен - я оракловод. Но примерно можно типа того сваять:

create or replace procedure InsertInMeTable(mySnapshot number,
myExchangeServer varchar2) is

INSERT INTO SyncTable(Snapshot, OU) VALUES(mySnapshot,
myExchangeServer);
exception when others then raise_application_error(-20001,
'Мы все умрем, Ошибка:' ||
chr(10) || sqlerrm);
end InsertInMeTable;

Т.е. вынести логику работы с базой в базе и оставить, а из клиента вызывать только хранимую процедуру. Это вас может сильно спасти как в случае с измененим логики, так и в случае падения производительности вашего приложения.
Да, то, что вы в триггере написали тоже стоит вынести в хранимые процедуры вставки/изменения/удаления. Так проще потом будет - триггеры вещь такая, может ОЧЕНЬ сильно повлиять на производительность вашей базы при интенсивном изменении данных в таблице. К тому же, не знаю как работает MS сервер, но после компиляции хранимых объектов при их вызове не тратиться время на синтаксический и семантический анализ запроса.
А код вызова хранимой процедуры тогда будет либо
command.CommandText = "begin InsertInMeTable; end;" либо меняйте тип command на StoredProcedure по моему. Вот как то так, извините за сумбурное объяснение - могз кипит. Просто хотел помочь :) Удачи!
айай :) неправильно сформулировал вопрос :(((
дело вот в чём... я понимаю что такое ХП. просто в данном конкретном примере не прибегал к их использованию. в продуктиве у меня само собой в хард-коде нет запросов (уволили б))) вопрос именно в том, каким образом триггер из текущего его вида вынести в ХП..

если я правильно понимаю, просто пишем ХП, в которой:
insert into [log_tableName] (
select * from [tableName] where =@
)
(это грубо говоря, само собой)...
Это просто - любые действия с БД вынести в ХП: функция вставки(возвращает ID), процедуры обновления и удаления.
Т.е. для обновления/удаления просто дергаете процедуру UpdateInMyTable, а в ней идет update SyncTable..., а потом сразу insert into SyncTableLog ...
таким образом вся логика в одном месте. Все просто, понятно и наглядно. В что куда триггер вставляет не всегда прозрачно и потенциально несет проблемы. Например у нас на триггерах работает только репликация с подчиненными узлами распределенной системы.
Суть вы вроде бы поняли верно :) И еще мой вам совет - в лог таблицу пишите время и имя пользователя/машины. Обезопасите себя от гневных реплик типа "чо за херня???"
Спасибо за статью! Очень интересно!
Тоже в свое время пришлось работать с AD. Нагуглил неплохую книгу на эту тему:
Addison.Wesley.The.dot.NET.Developers.Guide.to.Directory.Services.Programming.May.2006
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации