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;
}
}
}
Результат работы программы (консольное приложение):