Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Titulní Blogy Fotky Soubory

Mazinův blog o SharePointu

Programové získání změn provedených v SharePointu

Někdy může být zajímavé zjistit všechny změny provedené v SharePointu nebo některé jeho části během určitého období. Typickým scénářem jsou různé evidenceTuto informaci byste se mohli pokusit získat pomocí CAML query s dotazem na hodnotu sloupce Modified. Tato metoda má ale několik omezení:

  • nezachytíte operace smazání a ani vícenásobnou úpravu (pokud byste chtěli reagovat na každou změnu zvlášť)
  • nedá se použít u ničeho jiného než u položek seznamů a knihoven dokumentů
  • při potřebě reagovat na změny napříč více seznamy byste museli kontrolovat každý z nich

SharePoint provedené změny eviduje, především kvůli asynchronním event receiverům, notifikacím a workflow. V databázi mu k tomu slouží tabulka EventCache.

Evidují se změny těchto typů objektů:

  • Položky, soubory a adresáře
  • Vlastnosti seznamů, fieldy
  • Vlastnosti webů, notifikace
  • Skupiny a uživatelé

Naopak neevidují se změny těchto typů objektů:

  • webové aplikace
  • globální nastavení farmy
  • řešení (WSP), featury
  • webparty
  • konfigurace webů, kolekcí webů, webových aplikací a databází obsahu

Evidované typy změn:

  • Přidání
  • Změna vlastností
  • Smazání
  • Přejmenování
  • Přesun položek mezi seznamy

Můžeme zjišťovat  změny v rozsahu:

  • seznamu – SPList
  • webu – SPWeb
  • kolekce webů – SPSite
  • databáze obsahu – SPContentDatabase

Všechny tyto třídy mají metodu GetChanges. Ta má 4 prototypy:

  • GetChanges()
  • GetChanges(SPChangeQuery) – změny vyhovující podmínce
  • GetChanges(SPChangeToken) – změny od časového okamžiky doteď
  • GetChanges(SPChangeToken, SPChangeToken) – změny mezi 2 časovými okamžiky

Všechny vrací SPChangeCollection, což je kolekce potomků třídy SPChange, podle toho o změnu čeho šlo (např. SPChangeItem, SPChangeList, SPChangeUser, …).

Zastavme se ještě na chvíli u SPChangeTokenu. Ten kombinuje několik informací dohromady. Má i svou textovou podobu, na které si můžeme ukázat, co reprezentuje. Má následující strukturu: Int1;Int2;Guid;Long;Int3

  • Int1 - verze change tokenu. aktuálně 1.
  • Int2 – scope změny
    • 0 – databáze obsahu
    • 1 – kolekce webů
    • 2 – web
    • 3 – seznam
  • Guid - unikátní ID objektu, kterého se událost týká
  • Long – timestamp provedení změny, vyjádřeno v tickech
  • Int3 – číslo změny v EventCache tabulce

Příklad použití objektu SPChangeQuery:

SPContentDatabase db = SPContext.Current.Site.ContentDatabase; SPSite site = SPContext.Current.Site; SPWeb web = SPContext.Current.Web; SPChangeToken token = new SPChangeToken(SPChangeCollection.CollectionScope.ContentDB, db.Id, DateTime.Now - timespan); SPChangeQuery query = new SPChangeQuery(false, false); //nastavíme, že nás zajímají změny položek. Dalšími možnostmi jsou oznámení, fieldy, uživatelé a podobně query.Item = true; //jaké typy operací nás zajímají query.Update = true; query.Add = true; query.Delete = false; query.ChangeTokenStart = token; query.FetchLimit = 10; SPChangeCollection changes = web.GetChanges(query);

Tím ale bohužel práce nekončí. Spíš začíná. Jednotlivé změny, vrácené metodou GetChanges, jsou seřazeny chronologicky tak, jak byly postupně provedeny. Získáte ale jen sadu GUIDů identifikátorů jednotlivých objektů. Např. informace o změně položky obsahuje její ID, ID seznamu, ID webu a ID kolekce webů, kde se položka nachází. Žádné bližší detaily. Ty si musíte načíst z aktuální položky. Tedy pokud ještě existuje, protože se mohlo stát, že vámi zpracovávaná změna může být následována operací delete.

Výsledky metody GetChanges nepodléhají security-trimmingu, tedy “ořezání” podle práv uživatele. Důvodem je především rychlost, protože může jít i za krátký časový interval o poměrně dost dat. Takže se dozvíte o vzniku, změně a smazání i objektů, ke kterým nemáte přístup. Jak jsme si už ale řekli, informací, které se o těchto změnách, dozvíte je minimum. Smyslem, kromě rychlosti, je i to, že z nich nic (ani tajného) nezjistíte. Musíte je použít jako parametry metod pro získání webů, seznamů, položek a ty už security-trimming obsahují. Díky tomu tento mechanizmus nevytváří zadní vrátka do systému. Maximálně se s jeho pomocí dozvíte, že v čase T byla vytvořena položka s ID = Y.

A jak dlouho do minulosti se můžeme podívat? To záleží na nastavení vlastnosti ChangeLogRetentionPeriod třídy SPWebApplication. Standardní hodnota je 60 dní. Poté jsou záznamy prostřednictvím jobu smazány.

Zveřejněno 12. dubna 2015 22:00 by mazin

Komentář

Žádné komentáře
Neregistrovaní uživatele nemužou přidávat komentáře.

About mazin

V občance mám v kolonce jméno uvedeno Jan Vaněk. Věnuji se SharePointu přes 8 let. Hlavně jako architekt, programátor a autor pilotů a prototypů. Rád se totiž šťourám v tom, co má SharePoint "pod kapotou". A když narazím na něco zajímavého, napíšu o tom článek. Kromě toho občas přednáším, publikuju na Codeplexu a odpovídám na StackExchange. Jsem MVP, MCT, MCSD, MCITP, MCDBA a Certified Scrum Master.

Syndication

News

  • Web Developer
  • Enterprise Application Developer

  • Microsoft Office SharePoint Server 2007, Application Development
  • Microsoft Windows SharePoint Services 3.0, Application Development
  • Microsoft Office SharePoint Server 2007, Configuration
  • Microsoft Windows SharePoint Services 3.0, Configuration
  • .Net Framework 2.0, Distributed Applications
  • .Net Framework 2.0, Web Applications
  • .Net Framework 2.0, Windows Applications
Powered by Community Server (Personal Edition), by Telligent Systems
Vyvojar.cz na prodej!