Freigeben über


Abrufen von Änderungen aus dem Änderungsprotokoll

Letzte Änderung: Mittwoch, 29. Juli 2009

Gilt für: SharePoint Foundation 2010

Sie können programmgesteuert auf das Änderungsprotokoll zugreifen, indem Sie die GetChanges-Methode eines SPList-, SPWeb-, SPSite- oder SPContentDatabase-Objekts aufrufen. Die Aufrufe in jedem dieser Bereiche schließen progressiv immer mehr Daten ein. In jedem Fall wird von der GetChanges-Methode ein SPChangeCollection-Objekt zurückgegeben, das eine Auflistung der Einträge im Änderungsprotokoll enthält.

Abrufen aller Änderungen

Die Menge aller Änderungen, die von einem Aufruf der GetChanges-Methode zurückgegeben wird, kann abhängig von der Aufbewahrungszeit, die für das Protokoll festgelegt ist, und dem Bereich, für den der Aufruf erfolgt, sehr groß sein. Aus Gründen der Leistung werden Änderungen in Batches mit begrenzter Größe zurückgegeben. Die GetChanges-Methode sollte vom Code in einer Schleife aufgerufen werden, bis eine Auflistung mit null Änderungen zurückgegeben wird, wodurch angegeben wird, dass das Ende des Protokolls erreicht wurde.

Jede Änderung wird mit einem identifizierenden ChangeToken-Objekt gestempelt, und ein SPChangeCollection-Objekt besitzt eine LastChangeToken-Eigenschaft, die die letzte Änderung in der Auflistung identifiziert. Wenn Sie das LastChangeToken-Objekt aus dem ersten Batch mit Änderungen an die GetChanges-Methode beim Abrufen des zweiten Batches übergeben, werden im zweiten Batch die Änderungen ab dem Punkt im Protokoll berücksichtigt, an dem der vorherige Batch endete. Setzen Sie den Vorgang in der Weise fort, bis Sie eine leere Auflistung erhalten.

Bei dem folgenden Beispiel handelt es sich um eine einfache Konsolenanwendung zum Abrufen aller Änderungen aus dem Änderungsprotokoll auf Inhaltsdatenbankebene.

using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite site = new SPSite("https://localhost"))
            {
                SPContentDatabase db = site.ContentDatabase;

                // Get the first batch of changes, 
                // starting from the beginning of the log.
                SPChangeCollection changes = db.GetChanges();

                // Loop until the end of the log.
                int total = 0;
                while (changes.Count > 0)
                {
                    total += changes.Count;

                    // Go get another batch.
                    changes = db.GetChanges(changes.LastChangeToken);
                }
                Console.WriteLine("\nTotal changes = {0:#,#}", total);
            }
            Console.Write("\nPress ENTER to continue...");
            Console.Read();
        }
    }
}
Imports System
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.Administration

Module Test

    Sub Main()

        Using site As SPSite = New SPSite("https://localhost")

            Dim db As SPContentDatabase = site.ContentDatabase

            ' Get the first batch of changes, 
            ' starting from the beginning of the log.
            Dim changes As SPChangeCollection = db.GetChanges()

            ' Loop until the end of the log.
            Dim total As Long = 0
            While changes.Count > 0

                total += changes.Count

                ' Go get another batch.
                changes = db.GetChanges(changes.LastChangeToken)

            End While

            Console.WriteLine(vbCrLf + "Total changes: {0:#,#}", total)

        End Using

        Console.Write(vbCrLf + "Press ENTER to continue...")
        Console.ReadLine()

    End Sub

End Module

Lesen eines Teils des Protokolls

Sie können Änderungen aus einem Teil des Protokolls abrufen, indem Sie zwei SPChangeToken-Objekte an die GetChanges-Methode übergeben. Das erste Änderungstoken markiert die Stelle im Protokoll, an der der Lesevorgang beginnt, das zweite markiert dessen Beendigung.

Die folgenden Regeln gelten für die Änderungstoken, die als Argumente an die GetChanges-Methode übergeben werden.

  • Falls ein Token auf einen Zeitpunkt verweist, der vor dem Start des aktuellen Änderungsprotokolls liegt, wird von der Methode eine SPException-Ausnahme ausgegeben.

  • Falls der vom zweiten Token angegebene Zeitpunkt vor dem im ersten Token angegebenen Zeitpunkt liegt, wird von der Methode eine leere Auflistung zurückgegeben.

  • Falls das erste Token null ist, beginnt die zurückgegebene Änderungsauflistung am Anfang des aktuellen Änderungsprotokolls.

  • Falls das zweite Token null ist, enthält die zurückgegebene Änderungsauflistung alle Änderungen nach dem Datum, das vom ersten Änderungstoken angegeben wird, bis die Grenze für eine einzelne Auflistung erreicht ist. Falls in diesem Zeitraum mehr Änderungen aufgetreten sind, wird der erste Batch zurückgegeben.

Beim folgenden Beispiel handelt es sich um eine Konsolenanwendung, in der das Abrufen von Änderungen gezeigt wird, die im Protokoll während eines Zeitraums von sieben Tagen aufgezeichnet wurden.

using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite site = new SPSite("https://localhost"))
            {
                SPContentDatabase db = site.ContentDatabase;

                // Define the start and end dates.
                DateTime startDate = DateTime.UtcNow.AddDays(-30);
                DateTime endDate = startDate.AddDays(7);

                // Build start and end tokens.
                SPChangeToken startToken = new SPChangeToken(
                                                SPChangeCollection.CollectionScope.ContentDB,
                                                db.Id,
                                                startDate);

                SPChangeToken endToken = new SPChangeToken(
                                                SPChangeCollection.CollectionScope.ContentDB,
                                                db.Id,
                                                endDate);

                // Get the first batch of changes.
                SPChangeCollection changes = db.GetChanges(startToken, endToken);

                // Loop until the end of the log.
                int total = 0;
                while (changes.Count > 0)
                {
                    total += changes.Count;

                    // Go get another batch.
                    changes = db.GetChanges(changes.LastChangeToken, endToken);
                }
                Console.WriteLine("\nTotal changes = {0:#,#}", total);
            }
            Console.Write("\nPress ENTER to continue...");
            Console.Read();
        }
    }
}
Imports System
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.Administration

Module Test

    Sub Main()

        Using site As SPSite = New SPSite("https://localhost")

            Dim db As SPContentDatabase = site.ContentDatabase

            ' Define the start and end dates.
            Dim startDate As DateTime = DateTime.UtcNow.AddDays(-30)
            Dim endDate As DateTime = startDate.AddDays(7)

            ' Build start and end tokens.
            Dim startToken As SPChangeToken = New SPChangeToken( _
                                                SPChangeCollection.CollectionScope.ContentDB, _
                                                db.Id, _
                                                startDate)

            Dim endToken As SPChangeToken = New SPChangeToken( _
                                              SPChangeCollection.CollectionScope.ContentDB, _
                                              db.Id, _
                                              endDate)

            ' Get the first batch of changes.
            Dim changes As SPChangeCollection = db.GetChanges(startToken, endToken)

            ' Loop until the end of the log.
            Dim total As Long = 0
            While changes.Count > 0

                total += changes.Count

                ' Go get another batch.
                changes = db.GetChanges(changes.LastChangeToken, endToken)

            End While

            Console.WriteLine(vbCrLf + "Total changes: {0:#,#}", total)

        End Using

        Console.Write(vbCrLf + "Press ENTER to continue...")
        Console.ReadLine()

    End Sub

End Module