Wiederherstellen gelöschter Datensätze mit Code

[Dieser Artikel ist die Vorabveröffentlichungsdokumentation und unterliegt Änderungen.]

Manchmal löschen Personen Datensätze, die sie nicht benötigen. Administratoren können die Aufbewahrung gelöschter Datensätze aktivieren, damit sie gelöschte Datensätze innerhalb eines bestimmten Zeitraums wiederherstellen können. Erfahren Sie, wie Administratoren gelöschte Datensätze wiederherstellen können.

Wenn die Aufbewahrung gelöschter Datensätze aktiviert ist, können Entwickler die Restore Nachricht verwenden, um gelöschten Datensatz vor dem angegebenen Zeitraum wiederherzustellen. Der Zeitraum kann bis zu 30 Tage betragen.

Abrufen gelöschter Datensätze, die wiederhergestellt werden können

Um gelöschte Datensätze abzurufen, die wiederhergestellt werden können, legen Sie die Datenquelle der Abfrage auf "bin" fest. Die folgenden Beispiele geben bis zu drei gelöschte Kontodatensätze zurück.

Wenn Sie das SDK verwenden, können Sie Daten mithilfe von FetchXml oder QueryExpression abrufen.

Wenn Sie Daten mithilfe von FetchXml abrufen, legen Sie das Fetch-Element-Attributdatasource auf "bin" fest, wenn Sie Datensätze abrufen.

static EntityCollection GetDeletedAccountRecordsFetchXml(IOrganizationService service) {

   string queryString = @"<fetch top='3' datasource='bin'>
                     <entity name='account'>
                        <attribute name='name' />
                     </entity>
                     </fetch>";
   
   FetchExpression query = new(queryString);

   return service.RetrieveMultiple(query);
}

Wenn Sie Daten mithilfe von QueryExpression abrufen, legen Sie die QueryExpression.DataSource-Eigenschaft auf "bin" fest, wenn Sie Datensätze abrufen.

static EntityCollection GetDeletedAccountRecordsQueryExpression(IOrganizationService service) {

   QueryExpression query = new("account") { 
         ColumnSet = new ColumnSet("name"),
         DataSource = "bin",
         TopCount = 3
   };

   return service.RetrieveMultiple(query);
}

Wiederherstellen eines gelöschten Datensatzes

Verwenden Sie die Restore Nachricht, um einen gelöschten Datensatz wiederherzustellen. Der Target Parameter ist kein Verweis auf einen gelöschten Datensatz. Es ist ein vollständiger Datensatz, sodass Sie Spaltenwerte festlegen können, während Sie den Datensatz wiederherstellen. Alle ursprünglichen Spaltenwerte werden wiederhergestellt, es sei denn, Sie überschreiben sie durch Festlegen von Werten während des Restore Vorgangs.

Hinweis

Zu diesem Zeitpunkt können Sie Datensätze nur mithilfe des Primärschlüsselwerts wiederherstellen. Sie können keinen alternativen Schlüssel verwenden, um einen Datensatz wiederherzustellen.

Wie Sie einen gelöschten Datensatz wiederherstellen, hängt davon ab, ob Sie das SDK für .NET oder Web-API verwenden.

Wie Sie einen Datensatz mithilfe des SDK für .NET wiederherstellen, hängt davon ab, ob Sie früh gebundene Typen mithilfe von pac modelbuilder generieren oder ob Sie den spät gebundenen Stil verwenden.

Erfahren Sie mehr über Late-Bound- und Early-Bound-Programmierung mit dem SDK für .NET

Beispiel für frühe Bindung

Die statische RestoreAccountRecordEarlyBound Methode verwendet die Klassen RestoreRequest<T> und Account, die mit dem Pac-Modellbuilder generiert wurden.

/// <summary>
/// Restores an account record
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance</param>
/// <param name="accountId">The ID of the deleted account record.</param>
/// <param name="originalName">The original name value for the account record.</param>
/// <returns>The ID of the restored account</returns>
static Guid RestoreAccountRecordEarlyBound(
    IOrganizationService service, 
    Guid accountId,
    string originalName)
{
    Account accountToRestore = new()
    {
        Id = accountId,
        // Appending '(Restored)' to the original name
        // to demonstrate overwriting a value.
        Name = originalName + " (Restored)"
    };

    RestoreRequest<Account> request = new()
    {
        Target = accountToRestore
    };

    var response = (RestoreResponse)service.Execute(request);
    return response.id;
}

Beispiel mit später Bindung

Die statische RestoreAccountRecordLateBound Methode verwendet die OrganizationRequest-Klasse , um die Restore Nachricht aufzurufen und den Target Parameter festzulegen.

/// <summary>
/// Restores an account record
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance</param>
/// <param name="accountId">The ID of the deleted account record.</param>
/// <param name="originalName">The original name value for the account record.</param>
/// <returns>The ID of the restored account</returns>
static Guid RestoreAccountRecordLateBound(
   IOrganizationService service,
   Guid accountId,
   string originalName)
{
   Entity accountToRestore = new("account", accountId)
   {
         Attributes = {
            // Appending '(Restored)' to the original name
            // to demonstrate overwriting a value.
            {"name", originalName + " (Restored)"}
         }
   };

   OrganizationRequest request = new("Restore")
   {
         Parameters = {
            { "Target", accountToRestore }
         }
   };

   OrganizationResponse response = service.Execute(request);

   return (Guid)response.Results["id"];
}

Nachrichten mit dem SDK für .NET verwenden

Bewährte Methoden beim Wiederherstellen von Datensätzen

Vermeiden Sie beim Wiederherstellen von Datensätzen die folgenden Probleme:

Wenn einige verwandte Datensätze auf Datensätze verweisen, die durch die kaskadierende Beziehung entfernt wurden, schlägt der Wiederherstellungsvorgang fehl. Um dieses Problem zu vermeiden, stellen Sie immer die verwandten Datensätze wieder her, die durch das Löschen des aktuellen Datensatzes nicht entfernt wurden, bevor Sie versuchen, den primären Datensatz wiederherzustellen.

Name: RefCannotBeRestoredRecycleBinNotFound
Code: 0x80049959
Zahl: -2147182247
Meldung: Entity with id '<Guid Value>' and logical name '<Entity.LogicalName>' does not exist. We cannot restore the reference '<Referred Primary Key Name>' that must be restored as part of this Restore call. ValueToBeRestored: <Guid Value>, ReferencedEntityName: <Referenced Entity Name>, AttributeName: <Referred Attribute Name>

Geben Sie beim Erstellen von Datensätzen keine Primärschlüsselwerte an.

Lassen Sie Dataverse beim Erstellen eines Datensatzes immer den Primärschlüssel festlegen. Wenn Sie einen neuen Datensatz erstellen, der denselben Primärschlüsselwert wie ein gelöschter Datensatz aufweist, können Sie den gelöschten Datensatz nicht wiederherstellen. Wenn Sie den gelöschten Datensatz wiederherstellen möchten, löschen Sie zuerst den neuen Datensatz.

Name: DuplicateExceptionRestoreRecycleBin
Code: 0x80044a02
Zahl: -2147182279
Meldung: Please delete the existing conflicting record '<Entity Platform Name>' with primary key '<Primary Key Name>' and primary key value '<Primary Key Value>' before attempting restore.

Datensätze mit übereinstimmenden alternativen Schlüsselwerten blockieren die Wiederherstellung.

Wenn Sie einen Datensatz erstellen, der dieselben alternativen Schlüsselspaltenwerte wie ein gelöschter Datensatz enthält, können Sie den gelöschten Datensatz nicht wiederherstellen. Wenn Sie den gelöschten Datensatz wiederherstellen möchten, löschen Sie zuerst den neuen Datensatz.

Name: DuplicateExceptionEntityKeyRestoreRecycleBin
Code: 0x80049929
Zahl: -2147182295
Meldung: Duplicate entity key preventing restore of record '<Entity Platform Name>' with primary key '<Primary Key Name>' and primary key value '<Primary Key Value>'. See inner exception for entity key details.

Datensätze, die entfernte Auswahloptionen verwenden, werden nicht wiederhergestellt

Wenn Sie eine Optionssatzoption löschen und diese Option in einem gelöschten Datensatz verwendet wurde, können Sie den Datensatz nicht wiederherstellen, da die Option jetzt ungültig ist. Überprüfen Sie vor dem Löschen einer Optionssatzoption, ob keine Datensätze diese Option verwenden, einschließlich gelöschter Datensätze.

Name: PicklistValueOutOfRangeRecycleBin
Code: 0x80049949
Zahl: -2147182263
Meldung: Picklist value not valid, please add the invalid value back to the picklist before restoring record

Primärschlüsselverletzung beim Löschen

Wenn der Datensatz mit demselben Primärschlüssel bereits vorhanden ist, geschieht nichts. Um zu erzwingen, dass alle gelöschten Elemente aufgezeichnet werden, legen Sie die Einstellung DoNotEnforcePrimaryKeyOrgSettingRecycleBin mithilfe des Tools OrgDBOrgSettings für Microsoft Dynamics CRM fest.

Nach dem Aktivieren dieser Einstellung wird möglicherweise der folgende Fehler angezeigt:

Name: DuplicateExceptionRestoreRecycleBin
Code: 0x80049939
Zahl: -2147182279
Meldung: A record that has the attribute values Deleted Object already exists on Delete.

Ermitteln, welche Tabellen für die Protokollierung von gelöschten Datensätzen aktiviert sind

Bevor Sie dieses Feature aktivieren, enthält die Tabelle "Deleted Record Keeping Configuration(RecycleBinConfig)" keine Zeilen.

Im Laufe der Zeit werden die meisten Tabellen die Verwaltung von gelöschten Datensätzen ermöglichen. Lösungskomponenten, virtuelle Tabellen und elastische Tabellen werden für gelöschte Datensatzhaltungen nicht unterstützt. Einige Tabellen, die derzeit nicht aktiviert sind, können später aktiviert werden (z. B. Tabellen mit mehr als 600 Spalten). Eine Liste der Tabellen, die dieses Feature nicht unterstützen, finden Sie unter "Tabellen", die derzeit nicht unterstützt werden.

Sie können auch die Aufbewahrung gelöschter Datensätze für die Umgebung deaktivieren. Wenn die Aufbewahrung gelöschter Datensätze für eine Tabelle nicht aktiviert ist, finden Sie keine Datensätze, die zum Wiederherstellen berechtigt sind. Sie können Dataverse abfragen, um herauszufinden, ob die Aufbewahrung gelöschter Datensätze für eine Tabelle aktiviert ist oder nicht.

Tabellen, die für die Aufbewahrung gelöschter Datensätze aktiviert sind, haben eine Zeile in der RecycleBinConfig-Tabelle, wo statecode aktiv und isreadyforrecyclebin wahr ist. Die RecycleBinConfig Tabelle enthält nicht den Namen der Tabelle, sondern verweist auf eine Zeile in der Entitätstabelle , in der die logicalname Spalte den Logischen Namen der Tabelle enthält.

Verwenden Sie die folgende FetchXml-Abfrage, um festzustellen, bei welchen Tabellen die Protokollierung gelöschter Datensätze aktiviert ist:

<fetch>
  <entity name='recyclebinconfig'>
    <filter type='and'>
      <condition attribute='statecode'
        operator='eq'
        value='0' />
      <condition attribute='isreadyforrecyclebin'
        operator='eq'
        value='1' />
    </filter>
    <link-entity name='entity'
      from='entityid'
      to='extensionofrecordid'
      link-type='inner'
      alias='entity'>
      <attribute name='logicalname' />
      <order attribute='logicalname' />
    </link-entity>
  </entity>
</fetch>

Informationen zum Abfragen von Daten mithilfe von FetchXml

Erkennen, welche Tabellen nicht für die Aufbewahrung gelöschter Datensätze aktiviert sind

Um zu wissen, welche Tabellen nicht für die Aufbewahrung gelöschter Datensätze aktiviert sind, verwenden Sie die folgende FetchXml-Abfrage, die die Umgekehrte der Tabelle in " Erkennen, welche Tabellen aktiviert sind" ist.

<fetch>
  <entity name='entity'>
    <attribute name='logicalname' />
    <filter type='or'>
      <condition entityname='recyclebin'
        attribute='extensionofrecordid'
        operator='null' />
      <condition entityname='recyclebin'
        attribute='statecode'
        operator='ne'
        value='0' />
      <condition entityname='recyclebin'
        attribute='isreadyforrecyclebin'
        operator='ne'
        value='1' />
    </filter>
    <order attribute='logicalname' />
    <link-entity name='recyclebinconfig'
      from='extensionofrecordid'
      to='entityid'
      link-type='outer'
      alias='recyclebin' />
  </entity>
</fetch>

Informationen zum Abfragen von Daten mithilfe von FetchXml

Die Ergebnisse dieser Abfrage seit Mai 2024, als dieses Feature gestartet wurde, sind in Tabellen gespeichert, die derzeit nicht die Aufbewahrung gelöschter Datensätze unterstützen.

Konfiguration des Zeitraums für die automatische Bereinigung gelöschter Datensätze abrufen und festlegen

Legen Sie den Wert fest, der bestimmt, wie lange gelöschte Datensätze in der Spalte RecycleBinConfig.CleanupIntervalInDays wiederhergestellt werden können, wobei der Wert der Spalte Name ist organization. Jede andere Zeile in der RecycleBinConfig Tabelle weist einen CleanupIntervalInDays Spaltenwert von -1. Dieser Wert gibt an, dass für die organization Tabelle dieselben Werte verwendet werden.

Wenn Sie für eine andere Tabelle einen anderen Wert angeben möchten, legen Sie den CleanupIntervalInDays Spaltenwert fest, wo der Name mit dem logischen Namen der Tabelle übereinstimmt. Diese Spalte akzeptiert Werte bis zu 30. Legen Sie diesen Wert nicht fest, es sei denn, Sie möchten einen anderen Wert als der Standardeinstellung der Organisation verwenden.

Verwenden Sie diese statische SetCleanupIntervalInDays Methode, um den CleanupIntervalInDays Spaltenwert für eine bestimmte Tabelle festzulegen.

/// <summary>
/// Updates the CleanupIntervalInDays value for a specified table
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance</param>
/// <param name="entityId">The entityId of the table</param>
/// <param name="cleanupIntervalInDays">The new CleanupIntervalInDays value</param>
static void SetCleanupIntervalInDays(
    IOrganizationService service,
    Guid entityId,
    int cleanupIntervalInDays)
{

    QueryExpression query = new("recyclebinconfig")
    {
        ColumnSet = new ColumnSet("recyclebinconfigid"),
        Criteria = new FilterExpression(LogicalOperator.And)
        {
            Conditions = {
              {
                  new ConditionExpression(
                      attributeName: "extensionofrecordid",
                      conditionOperator: ConditionOperator.Equal,
                      value: entityId)
              }
          }
        }
    };

    EntityCollection records = service.RetrieveMultiple(query);

    if (records.Entities.Count.Equals(1))
    {
        Guid id = records.Entities[0].Id;

        Entity record = new(entityName: "recyclebinconfig", id: id)
        {
            Attributes = {
                { "cleanupintervalindays", cleanupIntervalInDays }
            }
        };

        service.Update(record);

    }
    else
    {
        throw new Exception($"Deleted record keeping configuration for table '{tableLogicalName}' not found.");
    }
}

Das SDK für .NET verwenden

Deaktivieren der Aufbewahrung gelöschter Datensätze für die Umgebung

Hinweis

Die bevorzugte Möglichkeit zum Deaktivieren der Aufbewahrung gelöschter Datensätze für eine Umgebung besteht darin, sie im Power Platform Admin Center zu deaktivieren. Die hier beschriebene Methode kann sich ändern, bevor das Feature allgemein verfügbar wird.

Löschen Sie die Zeile in der RecycleBinConfig-Tabelle , in der sich der name Wert befindet organization. Durch diese Aktion werden alle Datensätze in der RecycleBinConfig-Tabelle gelöscht und die Aufzeichnung gelöschter Datensätze für diese Umgebungskonfiguration deaktiviert.

Wichtig

Versuchen Sie nicht, andere einzelne Datensätze zu löschen. Es ist wichtig, dass Dataverse diese Aktion verwaltet.

Verwaltung der Wiederherstellung von Datensätzen, die durch benutzerdefinierte Geschäftslogik gelöscht wurden.

Dataverse bietet einen Mechanismus zum Verwalten der gewünschten Aktionen für verwandte Datensätze, wenn eine Zeile gelöscht wird. Diese Konfigurationsdaten sind Teil der Definition der Beziehung. Wenn ein verknüpfter Datensatz gelöscht wird, können Sie vier mögliche Verhaltensweisen konfigurieren:

Löschverhalten Beschreibung
Alle kaskadieren Löscht die zugehörigen Datensätze.
Link entfernen Legt die Nachschlagespalten auf den gelöschten Datensatz auf NULL fest.
Nicht kaskadieren Wendet keine Änderungen an verwandten Datensätzen an. (Nur intern)
Einschränken Verhindert das Löschen des Datensatzes, um die Datenintegrität aufrechtzuerhalten. Der Datensatz kann nur gelöscht werden, wenn keine Datensätze mit dieser Beziehung verbunden sind.

Weitere Informationen zu Beziehungsverhalten.

Wenn Sie die Beziehung für Cascade All, Remove Link oder Restrict konfigurieren, verwaltet Dataverse diese Verhaltensweisen, und es gibt nichts Zusätzliches zu tun.

Wenn Sie eine Beziehung so konfigurieren, dass sie das "Link entfernen"-Verhalten nutzt, die Beziehung jedoch den verknüpften Datensatz löschen soll, benötigen Sie möglicherweise eine angepasste Logik, die ein spezielles Verhalten umsetzt. Angenommen, Sie möchten auf dieses Verhalten anders reagieren und Ihr eigenes Verhalten Einige kaskadieren basierend auf von Ihnen festgelegten Regeln umsetzen. Beispielsweise können Sie inaktive Datensätze oder Datensätze löschen, die in einem bestimmten Zeitraum nicht aktualisiert wurden. Diese Logik wird in der Regel mithilfe eines Plug-Ins implementiert, kann aber auch mithilfe von Power Automate mit dem Microsoft Dataverse Connector erfolgen: Wenn eine Zeile hinzugefügt, geändert oder gelöscht wird.

Wenn Sie über diese Art von benutzerdefinierter Geschäftslogik verfügen, weiß Dataverse nicht darüber und kann Ihre Logik nicht automatisch rückgängig machen. Sie können jedoch ein weiteres Plug-In für die Restore Nachricht registrieren, um die benutzerdefinierte Logik rückgängig zu machen. Oder Sie können Power Automate und den Microsoft Dataverse-Connector verwenden: Wenn eine Aktion ausgeführt wird, den Trigger auslösen.

Wichtig

Achten Sie beim Registrieren von Plug-In-Schritten für die Restore Nachricht auf den Kontext. Der Datensatz, den Sie wiederherstellen, ist in der PreOperation-Phase nicht verfügbar. Wenn Sie verwandte Datensätze erstellen müssen, verwenden Sie die PostOperation Phase. Erfahren Sie mehr über Plug-In-Phasen.

Die InputParameters und OutputParameters der Restore Nachricht ähneln Create der Nachricht, sodass Plug-Ins, die für die Create Nachricht registriert werden, für die Restore Nachricht mit weniger Änderungen wiederverwendet werden können.

Tabellen, die zurzeit nicht für die Protokollierung gelöschter Datensätze unterstützt sind

Die in "Erkennen" beschriebene Abfrage , welche Tabellen nicht aktiviert sind , wurde zum Generieren dieser Liste im August 2024 verwendet.

Siehe auch

Gelöschte Microsoft Dataverse-Tabellendatensätze wiederherstellen