SPChangeQuery используется для получения данных об изменениях произошедших на сайте в различных разрезах. В отличие от аудита, данная возможность включёна по умолчанию, но возвращает меньше информации.
Для осуществления запроса вызывается метод .GetChanges() объекта SPSite, SPWeb, SPList или SPContentDatabase.
Рассмотрим возможные отслеживаемые действия:
var query = new SPChangeQuery(false, false) { Add = true, // Добавление объекта Delete = true, // Удаление объекта Update = true, // Обновление объекта SystemUpdate = true, // Системное обновление элемента GroupMembershipAdd = true, // Добавление пользователя в группу GroupMembershipDelete = true, // Добавление пользователя в группу Move = true, // Перемещение объекта Rename = true, // Переименование объекта Restore = true, //Восстановление объекта из корзины или архивной копии RoleAssignmentAdd = true, // Назначение роли пользователю или группе RoleAssignmentDelete = true, // Удаление роли RoleDefinitionAdd = true, // Назначение разрешений роли RoleDefinitionDelete = true, // Удаление разрешений роли RoleDefinitionUpdate = true, // Обновление разрешений роли };
и возможные отслеживаемые объекты:
var query = new SPChangeQuery(false, false) { Alert = true, // Оповещения ContentType = true, // Типы содержимого Field = true, // Поля списка File = true, // Файлы Folder = true, // Папки Group = true, // Группы Item = true, // Элементы списков List = true, // Списки Navigation = true, // Элементы навигации SecurityPolicy = true, // Политики безопасности Site = true, // Коллекция сайтов User = true, // Пользователи View = true, // Представления списков Web = true, // Сайт };
Также позволяет задавать начальную (ChangeTokenStart) или конечную (ChangeTokenEnd) дату возвращаемых изменений.
Пример использования:
Результат работы программы (консольное приложение):using (var site = new SPSite("http://site/"))
{
using (var web = site.OpenWeb())
{
var list = web.Lists["TestList"];
var timeZone = web.RegionalSettings.TimeZone;
var query = new SPChangeQuery(false, false)
{
FetchLimit = 500, // Limit
Item = true, // Object type
Add = true, // Change type
Delete = true, // Change type
Update = true, // Change type
ChangeTokenStart = new SPChangeToken(SPChangeCollection.CollectionScope.List, list.ID, new DateTime(2012, 05, 11)) //From date
};
Console.WriteLine("{0,-20}{1, -10}{2}", "Title/ID", "Action", "Time");
while (true)
{
var changes = list.GetChanges(query);
foreach (var change in changes.OfType<SPChangeItem>())
{
string itemTitle;
try
{
itemTitle = "Item Title: " + list.Items.GetItemById(change.Id).Title;
}
catch (Exception)
{
itemTitle = "Item Id: " + change.Id;
}
Console.WriteLine("{0,-20}{1, -10}{2}", itemTitle, change.ChangeType, timeZone.UTCToLocalTime(change.Time));
}
// Go to next batch or break
if (changes.Count < query.FetchLimit)
break;
query.ChangeTokenStart = changes.LastChangeToken;
}
}
}
Какие кейсы использования?
ОтветитьУдалитьА кем изменено/создано и т.д. можно отобразить?
ОтветитьУдалить