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 une corbeille pour les tables afin qu’elles puissent restaurer des enregistrements supprimés dans une période spécifiée. Découvrez comment les administrateurs peuvent restaurer des enregistrements supprimés
Lorsque la corbeille est activée, les développeurs peuvent utiliser le message pour restaurer l’enregistrement Restore 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 du fetch element à '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 afin de pouvoir définir les 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 façon dont vous restaurez un enregistrement à l’aide du Kit de développement logiciel (SDK) pour .NET varie selon que vous générez des types liés précoces à l’aide de pac modelbuilder ou si vous utilisez le style de liaison tardive.
En savoir plus sur la programmation à liaison tardive et liaison anticipée à l’aide du SDK pour .NET
Exemple de liaison anticipée
La méthode RestoreAccountRecordEarlyBound statique utilise les classes RestoreRequest<T> et Account générées avec 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 de liaison tardive
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
Voici des problèmes que vous pouvez éviter 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 dont la référence a été supprimée dans le cadre de la relation en cascade n’existent plus, l’opération de restauration échoue. Pour éviter ce problème, restaurez toujours les enregistrements associés non supprimés dans le cadre de l’enregistrement actif avant de tenter 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
Il est généralement recommandé de toujours laisser 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é, l’enregistrement supprimé ne peut pas être restauré. Si vous le faites, vous devez supprimer le nouvel enregistrement avant de pouvoir restaurer celui supprimé.
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 le restaurer. Si vous le faites, vous devez supprimer le nouvel enregistrement avant de pouvoir restaurer celui supprimé.
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 la restaurer, car l’option n’est plus 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 a déjà été supprimé auparavant, la copie dans la corbeille est ignorée pour l’enregistrement. Pour s'assurer que tous les éléments supprimés sont stockés dans la corbeille, vous pouvez configurer le paramètre à l’aide de l’outil
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 corbeille
Avant l’activation de la fonctionnalité corbeille, la table Recycle Bin Configuration (RecycleBinConfig) n’a aucune ligne.
Avec le temps, nous prévoyons que la plupart des tables seront disponibles pour utiliser la fonction de corbeille. Les composants de solution, les tables virtuelles et les tables élastiques ne sont pas pris en charge pour la corbeille. Pendant cette préversion, certaines tables actuellement non activées peuvent être activées ultérieurement (par exemple, les tables avec plus de 400 colonnes). Pour obtenir une liste des tables qui ne prennent pas en charge la corbeille, consultez Tables non prises en charge actuellement pour la corbeille.
Vous pouvez également désactiver la corbeille pour certaines tables précises et désactiver la corbeille pour l’environnement. Si la corbeille n’est pas activée pour une table, vous ne trouverez aucun enregistrement éligible à la restauration. Vous pouvez interroger Dataverse pour savoir si la corbeille est activée ou non pour une table.
Les tables activées pour la corbeille comportent une ligne dans la table RecycleBinConfig où statecode est actif et isreadyforrecyclebin a la valeur true. 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 sur lesquelles la corbeille est 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
Identifier les tables pour lesquelles la corbeille n’est pas activée.
Pour savoir quelles tables ne sont pas activées pour la corbeille, utilisez la requête FetchXml suivante qui est l’inverse de celle trouvée dans Détecter les tables activées pour la corbeille.
<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 à compter de mai 2024 lorsque cette fonctionnalité d'évaluation a commencé sont disponibles dans Tables non prises en charge actuellement pour la corbeille
Obtenir et définir la configuration du délai de nettoyage automatique pour la corbeille
Valeur permettant de déterminer la durée pendant laquelle les enregistrements supprimés sont disponibles pour être restaurés est définie 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 autorise les valeurs jusqu’à 30, nous vous recommandons de ne pas la définir, sauf si elle diffère de la valeur par défaut de l’organisation.
Vous pouvez utiliser 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($"Recycle bin configuration for table '{tableLogicalName}' not found.");
}
}
Désactiver la corbeille pour une table
Pour désactiver la corbeille d’une table, désactivez l’enregistrement recyclebinconfig de la table en définissant les propriétés statecode et statuscode sur leurs valeurs inactives : 2 et 1 respectivement.
Note
Les requêtes suivantes comparent la EntityId valeur à la valeur de colonne Entity.EntityId , qui stocke la table EntityMetadata.MetadataId .
Utilisez cette méthode DisableRecycleBinForTable statique pour désactiver la corbeille pour une table spécifique.
/// <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);
}
}
Désactiver la corbeille pour l’environnement
Note
La meilleure façon de désactiver la corbeille d’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". Cela déclenche la suppression de tous les enregistrements de la table RecycleBinConfig et désactive la corbeille pour l’environnement.
Important
N’essayez pas de supprimer d’autres enregistrements individuels. Il est important que Dataverse gère cela.
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é, il existe quatre comportements possibles que vous pouvez configurer :
| Supprimer le comportement | Descriptif |
|---|---|
| Tout en cascade | Les enregistrements associés sont supprimés. |
| Supprimer le lien | Les colonnes de recherche sur l’enregistrement supprimé sont définies sur Null. |
| Sans mise en cascade | Aucune modification n’est appliquée aux enregistrements associés. (Interne uniquement) |
| Restreindre | Dataverse 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
Il n’y a rien à faire lorsque la relation est configurée pour Cascade All, Remove Link et Restrict , car Dataverse gère ces comportements.
Si vous avez une relation configurée pour utiliser le comportement Supprimer le lien , mais que cette relation est censée supprimer l’enregistrement associé, vous pouvez avoir 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 en cours de restauration ne sera pas disponible à l’étape PreOperation . Si des enregistrements connexes doivent être créé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.
Tables non prises en charge actuellement pour la corbeille
La requête décrite dans Détecter les tables dont la corbeille n’est pas activée a été utilisée pour générer cette liste en août 2024.
Voir aussi
Restaurer les enregistrements de table Microsoft Dataverse supprimés (préversion)