Freigeben über


Wiederherstellen gelöschter Datensätze mit Code (Vorschau)

[Dieser Artikel ist Teil der Dokumentation zur Vorabversion und kann geändert werden.]

Manchmal löschen Personen Datensätze, die sie nicht benötigen. Administratoren können einen Papierkorb für Tabellen 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 der Papierkorb im Einsatz ist, können Entwickler die Restore Nachricht verwenden, um gelöschte Einträge innerhalb des angegebenen Zeitraums 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 Die Web-API verwenden.

Wie Sie einen Datensatz mithilfe des SDK für .NET wiederherstellen, hängt davon ab, ob Sie frühe gebundene Typen mithilfe des Pac-Modellbuilders generieren oder ob Sie die spät gebundene Formatvorlage verwenden.

Informationen zur spät gebundenen und früh gebundenen Programmierung mithilfe des SDK für .NET

Beispiel für frühe Bindung

Die statische RestoreAccountRecordEarlyBound Methode verwendet die RestoreRequest<T>- und die Account-Klassen, die mit dem pac modelbuilder 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

Im Folgenden finden Sie Probleme, die Sie beim Wiederherstellen von Datensätzen vermeiden können:

Wenn einige verwandte Datensätze, deren Verweis als Teil der Weitergabebeziehung entfernt wurde, nicht mehr vorhanden sind, schlägt der Wiederherstellungsvorgang fehl. Um dieses Problem zu vermeiden, stellen Sie die verknüpften Datensätze immer wieder her, die nicht als Teil des aktuellen Datensatzes gelöscht 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.

Im Allgemeinen empfiehlt es sich, beim Erstellen eines Datensatzes immer Dataverse den Primärschlüssel festlegen zu lassen. Wenn Sie einen neuen Datensatz erstellen, der denselben Primärschlüsselwert wie ein gelöschter Datensatz aufweist, kann der gelöschte Datensatz nicht wiederhergestellt werden. Wenn Sie dies tun, müssen Sie den neuen Datensatz löschen, bevor Sie den gelöschten Datensatz wiederherstellen können.

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 ihn nicht wiederherstellen. Wenn Sie dies tun, müssen Sie den neuen Datensatz löschen, bevor Sie den gelöschten Datensatz wiederherstellen können.

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 sie 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 zuvor bereits gelöscht wurde, wird das Kopieren in den Papierkorb für den Datensatz ignoriert. Um sicherzustellen, dass alle gelöschten Elemente im Papierkorb gespeichert werden, können Sie die DoNotEnforcePrimaryKeyOrgSettingRecycleBin-Einstellung mithilfe des OrgDBOrgSettings-Tools für Microsoft Dynamics CRM festlegen.

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.

Herausfinden, bei welchen Tabellen der Papierkorb aktiviert ist

Bevor das Feature "Papierkorb" aktiviert ist, enthält die Tabelle "Papierkorbkonfiguration" (RecycleBinConfig) keine Zeilen.

Mit der Zeit ist davon auszugehen, dass die meisten Tabellen für die Verwendung der Papierkorbfunktion verfügbar sein werden. Lösungskomponenten, virtuelle Tabellen und elastische Tabellen werden für den Papierkorb nicht unterstützt. In dieser Vorschau können einige Tabellen, die derzeit nicht aktiviert sind, später aktiviert werden (z. B. Tabellen mit mehr als 400 Spalten). Eine Liste der Tabellen, die den Papierkorb nicht unterstützen, finden Sie unter Tabellen, die derzeit für den Papierkorb nicht unterstützt werden.

Sie können den Papierkorb auch für bestimmte Tabellen deaktivieren und den Papierkorb für die Umgebung deaktivieren. Wenn der Papierkorb für eine Tabelle nicht aktiviert ist, gibt es keine Datensätze, die wiederhergestellt werden können. Sie können Dataverse abfragen, um herauszufinden, ob der Papierkorb für eine Tabelle aktiviert ist oder nicht.

Tabellen, die für den Papierkorb aktiviert sind, haben eine Zeile in der RecycleBinConfig-Tabelle, in welcher der statecode aktiv und isreadyforrecyclebin auf „true“ gesetzt 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 zu erkennen, welche Tabellen den Papierkorb aktiviert haben:

<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

Ermitteln, welche Tabellen die Papierkorb-Funktion nicht aktiviert haben

Um zu erfahren, welche Tabellen nicht für den Papierkorb aktiviert sind, verwenden Sie die folgende FetchXml-Abfrage, die das Gegenteil von der in Erkennen, welche Tabellen für den Papierkorb 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 finden sich Stand Mai 2024, als diese Previewfunktion begann, in Tabellen, die derzeit nicht für den Papierkorb unterstützt werden

Abrufen und Festlegen der Konfiguration des automatischen Bereinigungszeitraums für den Papierkorb

Der Wert, der bestimmt, wie lange gelöschte Datensätze wiederhergestellt werden können, wird in der Spalte "RecycleBinConfig.CleanupIntervalInDays " festgelegt, in der der Spaltenwert "Name " angegeben 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. In dieser Spalte sind Werte von bis zu 30 zulässig. Wir empfehlen, sie nicht festzulegen, es sei denn, sie weicht vom Standardwert der Organisation ab.

Mit dieser statischen SetCleanupIntervalInDays Methode können Sie den CleanupIntervalInDays Spaltenwert für eine bestimmte Tabelle festlegen.

/// <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($"Recycle bin configuration for table '{tableLogicalName}' not found.");
    }
}

Das SDK für .NET verwenden

Deaktivieren des Papierkorbs für eine Tabelle

Um den Papierkorb für eine Tabelle zu deaktivieren, deaktivieren Sie den recyclebinconfig-Datensatz für die Tabelle, indem Sie die Eigenschaften statecode und statuscode auf ihre Inaktiv-Werte 2 bzw. 1 festlegen.

Hinweis

Die folgenden Abfragen vergleichen den EntityId Wert mit dem Spaltenwert "Entity.EntityId ", der die Tabelle "EntityMetadata.MetadataId " speichert.

Verwenden Sie diese statische DisableRecycleBinForTable Methode, um den Papierkorb für eine bestimmte Tabelle zu deaktivieren.

/// <summary>
/// Disable the Recycle bin for a specified table
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance</param>
/// <param name="tableEntityId">The entityId of the table</param>
static void DisableRecycleBinForTable(
    IOrganizationService service,
    Guid tableEntityId)
{

    QueryExpression query = new("recyclebinconfig")
    {
        ColumnSet = new ColumnSet("recyclebinconfigid")
    };

    LinkEntity entityLink = query.AddLink(
      "entity", 
      "extensionofrecordid", 
      "entityid");

    entityLink.LinkCriteria.AddCondition(
      "extensionofrecordid", 
      ConditionOperator.Equal, 
      tableEntityId);

    EntityCollection recyclebinconfigs = service.RetrieveMultiple(query);

    if (recyclebinconfigs.Entities.Count.Equals(1))
    {

        var id = recyclebinconfigs.Entities[0].GetAttributeValue<Guid>("recyclebinconfigid");

        Entity recyclebinconfig = new("recyclebinconfig", id)
        {
            Attributes = {
                { "statecode", new OptionSetValue(1) },
                { "statuscode", new OptionSetValue(2) }
            }
        };

        service.Update(recyclebinconfig);
    }
    else
    {
        string message = $"Recycle bin configuration for table '{extensionofrecordid}' not found.";
        throw new Exception(message);
    }
}

Das SDK für .NET verwenden

Papierkorb für die Umgebung deaktivieren

Hinweis

Die bevorzugte Methode, den Papierkorb für eine Umgebung zu deaktivieren, besteht darin, ihn im Power Platform Admin Center auszuschalten. 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". Dies löst das Löschen aller Datensätze in der RecycleBinConfig-Tabelle aus und deaktiviert den Papierkorb für die Umgebung.

Von Bedeutung

Versuchen Sie nicht, andere einzelne Datensätze zu löschen. Es ist wichtig, dass Dataverse dies 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, gibt es vier mögliche Verhaltensweisen, die Sie konfigurieren können:

Löschverhalten Description
Alle kaskadieren Die zugehörigen Datensätze werden gelöscht.
Link entfernen Die Nachschlagespalten für den gelöschten Datensatz werden auf NULL festgelegt.
Nicht kaskadieren Es werden keine Änderungen auf verknüpfte Datensätze angewendet. (Nur intern)
Einschränken Dataverse verhindert, dass der Datensatz gelöscht wird, 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

Es gibt nichts zu tun, wenn die Beziehung für Cascade All, Remove Link und Restrict konfiguriert ist, da Dataverse diese Verhaltensweisen verwaltet.

Wenn Sie eine Beziehung für die Verwendung des Verhaltens "Link entfernen " konfiguriert haben, diese Beziehung jedoch den zugehörigen Datensatz löschen soll, verfügen Sie möglicherweise über eine benutzerdefinierte Logik, die ein benutzerdefiniertes Verhalten anwendet. 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 ausgeführt werden: 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.

Von Bedeutung

Achten Sie beim Registrieren von Plug-In-Schritten für die Restore Nachricht auf den Kontext. Der wiederhergestellte Datensatz wird in der PreOperation-Phase nicht verfügbar sein. Wenn verwandte Datensätze erstellt werden 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 derzeit nicht für den Papierkorb unterstützt werden

Die in Erkennen, für welche Tabellen der Papierkorb nicht aktiviert ist beschriebene Abfrage wurde verwendet, um diese Liste im August 2024 zu generieren.

Siehe auch

Wiederherstellen gelöschter Microsoft Dataverse-Tabellendatensätze (Vorschau)