Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
[Cet article fait partie de la documentation en version préliminaire et peut faire l’objet de modifications.]
Parfois, les utilisateurs suppriment des enregistrements qu’ils ne devraient pas. Les administrateurs peuvent activer la conservation des enregistrements supprimés afin qu’ils puissent restaurer les enregistrements supprimés dans une période spécifiée. Découvrez comment les administrateurs peuvent restaurer des enregistrements supprimés.
Lorsque la conservation des enregistrements supprimés est activée, les développeurs peuvent utiliser le Restore message pour restaurer l’enregistrement supprimé avant la période spécifiée. La période peut être jusqu’à 30 jours.
Récupérer les enregistrements supprimés qui peuvent être restaurés
Pour récupérer les enregistrements supprimés qui peuvent être restaurés, définissez la source de données de la requête sur «bin ».
Les exemples suivants retournent jusqu’à trois enregistrements de compte supprimés.
Lorsque vous utilisez le Kit de développement logiciel (SDK), vous pouvez récupérer des données à l’aide de FetchXml ou queryExpression.
Lorsque vous récupérez des données à l’aide de FetchXml, définissez l’attribut de l’élément de récupération fetchdatasource sur « bin » lorsque vous récupérez des enregistrements.
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);
}
Lorsque vous récupérez des données à l’aide de QueryExpression, définissez la propriété QueryExpression.DataSource sur «bin » lorsque vous récupérez des enregistrements.
static EntityCollection GetDeletedAccountRecordsQueryExpression(IOrganizationService service) {
QueryExpression query = new("account") {
ColumnSet = new ColumnSet("name"),
DataSource = "bin",
TopCount = 3
};
return service.RetrieveMultiple(query);
}
Restaurer un enregistrement supprimé
Utilisez le Restore message pour restaurer un enregistrement supprimé. Le Target paramètre n’est pas une référence à un enregistrement supprimé. Il s’agit d’un enregistrement complet qui vous permet de définir des valeurs de colonne lors de la restauration de l’enregistrement. Toutes les valeurs de colonne d’origine sont restaurées, sauf si vous les remplacez en définissant des valeurs pendant l’opération Restore .
Note
À ce stade, vous pouvez uniquement restaurer des enregistrements à l’aide de la valeur de clé primaire. Vous ne pouvez pas utiliser une autre clé pour restaurer un enregistrement.
La façon dont vous restaurez un enregistrement supprimé dépend de l’utilisation du Kit de développement logiciel (SDK) pour .NET ou l’API web.
La manière dont vous restaurez un enregistrement à l'aide du Kit de développement logiciel (SDK) pour .NET dépend de si vous générez des types liés tôt avec pac modelbuilder, ou si vous utilisez le style lié tardivement.
Exemple de liaison anticipée
La méthode statique RestoreAccountRecordEarlyBound utilise les classes RestoreRequest<T> et Account générées à l’aide du pac modelbuilder.
/// <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;
}
Exemple lié en retard
La méthode statique RestoreAccountRecordLateBound utilise la classe OrganizationRequest pour appeler le Restore message, en définissant le Target paramètre.
/// <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"];
}
Meilleures pratiques lors de la restauration d’enregistrements
Évitez les problèmes suivants lors de la restauration des enregistrements :
- Restaurer les enregistrements associés avant de restaurer l’enregistrement principal
- Ne spécifiez pas de valeurs de clé primaire lors de la création d’enregistrements
- Les enregistrements avec des valeurs de clé alternative correspondantes bloquent la restauration
- Les enregistrements utilisant les options Choix supprimées ne sont pas restaurés
- Violation de clé primaire lors de la suppression
Restaurer les enregistrements associés avant de restaurer l’enregistrement principal
Si certains enregistrements associés référencent les enregistrements supprimés par la relation en cascade, l’opération de restauration échoue. Pour éviter ce problème, restaurez toujours les enregistrements associés que la suppression d’enregistrement en cours n’a pas supprimé avant d’essayer de restaurer l’enregistrement principal.
Nom :
RefCannotBeRestoredRecycleBinNotFound
Code :0x80049959
Nombre :-2147182247
Message :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>
Ne spécifiez pas de valeurs de clé primaire lors de la création d’enregistrements
Laissez toujours Dataverse définir la clé primaire lors de la création d’un enregistrement. Si vous créez un enregistrement qui a la même valeur de clé primaire qu’un enregistrement supprimé, vous ne pouvez pas restaurer l’enregistrement supprimé. Si vous souhaitez restaurer l’enregistrement supprimé, supprimez d’abord le nouvel enregistrement.
Nom :
DuplicateExceptionRestoreRecycleBin
Code :0x80044a02
Nombre :-2147182279
Message :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.
Les enregistrements avec des valeurs de clé alternative correspondantes bloquent la restauration
Si vous créez un enregistrement qui a les mêmes valeurs de colonne de clé alternative qu’un enregistrement supprimé, vous ne pouvez pas restaurer l’enregistrement supprimé. Si vous souhaitez restaurer l’enregistrement supprimé, supprimez d’abord le nouvel enregistrement.
Nom :
DuplicateExceptionEntityKeyRestoreRecycleBin
Code :0x80049929
Nombre :-2147182295
Message :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.
Les enregistrements utilisant les options Choix supprimées ne sont pas restaurés
Si vous supprimez une option d’ensemble d’options et que cette option a été utilisée dans un enregistrement supprimé, vous ne pouvez pas restaurer l’enregistrement, car l’option n’est pas valide. Avant de supprimer une option de jeu d’options, vérifiez qu’aucun enregistrement n’utilise cette option, y compris les enregistrements supprimés.
Nom :
PicklistValueOutOfRangeRecycleBin
Code :0x80049949
Nombre :-2147182263
Message :Picklist value not valid, please add the invalid value back to the picklist before restoring record
Violation de la clé primaire lors de la suppression
Si l’enregistrement avec la même clé primaire existe déjà, rien ne se produit. Pour appliquer l’enregistrement de tous les éléments supprimés, définissez le paramètre DoNotEnforcePrimaryKeyOrgSettingRecycleBin à l’aide de l’outil OrgDBOrgSettings pour Microsoft Dynamics CRM.
Après avoir activé ce paramètre, vous pouvez recevoir l’erreur suivante :
Nom :
DuplicateExceptionRestoreRecycleBin
Code :0x80049939
Nombre :-2147182279
Message :A record that has the attribute values Deleted Object already exists on Delete.
Détecter les tables activées pour la conservation des enregistrements supprimés
Avant d’activer cette fonctionnalité, la table Deleted Record Keeping Configuration (RecycleBinConfig) n’a aucune ligne.
Au fil du temps, la plupart des tables prennent en charge la conservation des enregistrements supprimés. Les composants de solution, les tables virtuelles et les tables élastiques ne sont pas pris en charge pour la conservation des enregistrements supprimés. Certaines tables qui ne sont pas actuellement activées peuvent être activées ultérieurement (par exemple, les tables avec plus de 600 colonnes). Pour obtenir la liste des tables qui ne prennent pas en charge cette fonctionnalité, consultez Tables non prises en charge actuellement.
Vous pouvez également désactiver la conservation des enregistrements supprimés pour l’environnement. Si la conservation des enregistrements supprimés n’est pas activée pour une table, vous ne trouverez aucun enregistrement éligible à la restauration. Vous pouvez interroger Dataverse pour savoir si la conservation des enregistrements supprimés est activée pour une table ou non.
Les tables qui sont activées pour la conservation des enregistrements supprimés ont une ligne dans la table RecycleBinConfig où statecode est actif et isreadyforrecyclebin est vrai. La RecycleBinConfig table ne contient pas le nom de la table, mais fait référence à une ligne dans la table Entity où la logicalname colonne contient le nom logique de la table.
Utilisez la requête FetchXml suivante pour détecter les tables qui ont supprimé la conservation des enregistrements activée :
<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>
Apprendre à interroger des données à l’aide de FetchXml
Détecter les tables qui ne sont pas activées pour la conservation des enregistrements supprimés
Pour savoir quelles tables ne sont pas activées pour la conservation des enregistrements supprimés, utilisez la requête FetchXml suivante qui est l’inverse de celle trouvée dans Détecter les tables activées.
<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>
Apprendre à interroger des données à l’aide de FetchXml
Les résultats de cette requête, depuis que la fonctionnalité a commencé en mai 2024, se trouvent dans les tables actuellement non prises en charge pour la conservation des enregistrements supprimés.
Récupérer et définir la configuration de l'intervalle de nettoyage automatique pour la gestion des enregistrements supprimés.
Définissez la valeur qui détermine la durée pendant laquelle les enregistrements supprimés sont disponibles pour être restaurés dans la colonne RecycleBinConfig.CleanupIntervalInDays où la valeur de colonne Name est organization. Toutes les autres lignes dans la table RecycleBinConfig ont une valeur de colonne CleanupIntervalInDays de -1. Cette valeur indique qu’elle utilise les mêmes valeurs définies pour la organization table.
Pour spécifier une valeur différente pour une autre table, définissez la valeur de la colonne CleanupIntervalInDays où la valeur de Name correspond au nom logique de la table. Cette colonne accepte jusqu’à 30 valeurs. Ne définissez pas cette valeur, sauf si vous souhaitez utiliser une valeur différente de la valeur par défaut de l’organisation.
Utilisez cette méthode statique SetCleanupIntervalInDays pour définir la CleanupIntervalInDays valeur de colonne d’une table spécifique.
/// <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.");
}
}
Désactiver la conservation des enregistrements supprimés pour l’environnement
Note
La meilleure façon de désactiver la conservation des enregistrements supprimés pour un environnement consiste à la désactiver dans le Centre d’administration Power Platform. La méthode décrite ici peut changer avant que la fonctionnalité ne devienne généralement disponible.
Supprimez la ligne de la table RecycleBinConfig où la name valeur est organization. Cette action supprime tous les enregistrements de la RecycleBinConfig table et désactive la conservation des enregistrements supprimés pour l’environnement.
Important
N’essayez pas de supprimer d’autres enregistrements individuels. Il est important que Dataverse gère cette action.
Gérer la restauration des enregistrements supprimés par une logique métier personnalisée
Dataverse fournit un mécanisme permettant de gérer les actions souhaitées pour les enregistrements associés lorsqu’une ligne est supprimée. Ces données de configuration font partie de la définition de la relation. Lorsqu’un enregistrement associé est supprimé, vous pouvez configurer quatre comportements possibles :
| Supprimer le comportement | Description |
|---|---|
| Tout en cascade | Supprime les enregistrements associés. |
| Supprimer le lien | Définit les colonnes de recherche sur l’enregistrement supprimé sur Null. |
| Sans mise en cascade | Applique aucune modification aux enregistrements associés. (Interne uniquement) |
| Restreindre | Empêche la suppression de l’enregistrement pour maintenir l’intégrité des données. L’enregistrement ne peut pas être supprimé, sauf s’il n’existe aucun enregistrement lié à cette relation. |
En savoir plus sur les comportements de relation.
Lorsque vous configurez la relation pour Cascade All, Remove Link ou Restrict, Dataverse gère ces comportements et il n’y a rien d’supplémentaire à faire.
Si vous configurez une relation pour utiliser le comportement Supprimer le lien , mais que la relation est censée supprimer l’enregistrement associé, vous devrez peut-être une logique personnalisée qui applique un comportement personnalisé. Par exemple, vous pouvez souhaiter répondre différemment à ce comportement et implémenter votre propre comportement « Cascade some » en fonction des règles que vous définissez. Par exemple, vous pouvez supprimer des enregistrements inactifs ou des enregistrements qui n’ont pas été mis à jour pendant une certaine période. Cette logique est généralement implémentée à l’aide d’un plug-in, mais elle peut également être effectuée à l’aide de Power Automate avec le connecteur Microsoft Dataverse : lorsqu’une ligne est ajoutée, modifiée ou supprimée.
Si vous avez ce type de logique métier personnalisée, Dataverse ne le sait pas et ne peut pas annuler automatiquement votre logique. Toutefois, vous pouvez inscrire un autre plug-in sur le Restore message pour inverser la logique personnalisée dont vous disposez. Vous pouvez également utiliser Power Automate et le connecteur Microsoft Dataverse : déclenchement lors de l'exécution d'une action.
Important
Soyez attentif au contexte lorsque vous enregistrez des étapes de plugin pour le message Restore. L’enregistrement que vous restaurez n’est pas disponible à l’étape PreOperation . Si vous devez créer des enregistrements associés, utilisez la PostOperation phase.
En savoir plus sur les étapes des modules d'extension.
Les InputParameters et OutputParameters du Restore message sont similaires au Create message. Les plug-ins écrits pour être enregistrés pour le Create message peuvent donc être réutilisés pour le Restore message avec moins de modifications.
Les tables ne sont pas actuellement prises en charge pour la gestion des enregistrements supprimés
La requête décrite dans Détecter les tables qui ne sont pas activées a été utilisée pour générer cette liste en août 2024.
Voir également :
Restaurer les enregistrements de table supprimés dans Microsoft Dataverse