Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
[Este artículo es documentación preliminar y está sujeto a modificaciones].
A veces, las personas eliminan registros que no deberían. Los administradores pueden habilitar una papelera de reciclaje para las tablas para que puedan restaurar registros eliminados dentro de un período de tiempo especificado. Obtenga información sobre cómo los administradores pueden restaurar registros eliminados
Cuando la papelera de reciclaje está habilitada, los desarrolladores pueden usar el mensaje para restaurar el Restore registro eliminado antes del período de tiempo especificado. El período de tiempo puede ser de hasta 30 días.
Recuperación de registros eliminados que se pueden restaurar
Para recuperar los registros eliminados que se pueden restaurar, establezca el origen de datos de la consulta en "bin".
En los ejemplos siguientes se devuelven hasta tres registros de cuenta eliminados.
Al usar el SDK, puede recuperar datos mediante FetchXml o QueryExpression.
Al recuperar datos mediante FetchXml, establezca el atributo del elemento fetchdatasource en "bin" al recuperar registros.
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);
}
Al recuperar datos mediante QueryExpression, establezca la propiedad QueryExpression.DataSource en "bin" al recuperar registros.
static EntityCollection GetDeletedAccountRecordsQueryExpression(IOrganizationService service) {
QueryExpression query = new("account") {
ColumnSet = new ColumnSet("name"),
DataSource = "bin",
TopCount = 3
};
return service.RetrieveMultiple(query);
}
Restauración de un registro eliminado
Use el Restore mensaje para restaurar un registro eliminado. El Target parámetro no es una referencia a un registro eliminado, es un registro completo para que pueda establecer valores de columna mientras restaura el registro. Todos los valores de columna originales se restauran a menos que los invalide estableciendo valores durante la Restore operación.
Nota:
En este momento solo puede restaurar registros mediante el valor de clave principal. No puede usar una clave alternativa para restaurar un registro.
La forma de restaurar un registro eliminado depende de si usa el SDK para .NET o la API web.
La forma de restaurar un registro mediante el SDK para .NET depende de si generas tipos de enlace temprano utilizando el pac modelbuilder, o si usas el estilo de enlace tardío.
Ejemplo de enlace adelantado
El método estático RestoreAccountRecordEarlyBound usa las clases RestoreRequest<T> y Account, generadas mediante el 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;
}
Ejemplo de enlace tardío
El método estático RestoreAccountRecordLateBound usa la clase OrganizationRequest para invocar el Restore mensaje, estableciendo el Target parámetro .
/// <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"];
}
Procedimientos recomendados al restaurar registros
Estos son los problemas que puede evitar al restaurar registros:
- Restaurar registros relacionados antes de restaurar el registro principal
- No especifique los valores de clave principal al crear registros
- Registros con valores de clave alternativos coincidentes bloquean la restauración
- Los registros que usan opciones de opción eliminadas no se restauran
- Infracción de clave principal al eliminar
Restaurar registros relacionados antes de restaurar el registro principal
Si ya no existen algunos registros relacionados cuya referencia se quitó como parte de la relación en cascada, se produce un error en la operación de restauración. Para evitar este problema, restaure siempre los registros relacionados no eliminados como parte del registro actual antes de intentar restaurar el registro principal.
Nombre:
RefCannotBeRestoredRecycleBinNotFound
Código:0x80049959
Número:-2147182247
Mensaje: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>
No especifique los valores de clave principal al crear registros
Por lo general, se recomienda dejar que Dataverse establezca siempre la clave principal al crear un registro. Si crea un registro que tiene el mismo valor de clave principal que un registro eliminado, no se puede restaurar el registro eliminado. Si lo hace, debe eliminar el nuevo registro para poder restaurar el eliminado.
Nombre:
DuplicateExceptionRestoreRecycleBin
Código:0x80044a02
Número:-2147182279
Mensaje: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.
Registros con valores de clave alternativos coincidentes bloquean la restauración
Si crea un registro que tenga los mismos valores de columna de clave alternativa que un registro eliminado, no podrá restaurarlo. Si lo hace, debe eliminar el nuevo registro para poder restaurar el eliminado.
Nombre:
DuplicateExceptionEntityKeyRestoreRecycleBin
Código:0x80049929
Número:-2147182295
Mensaje: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.
Los registros que usan opciones de opción eliminadas no se restauran
Si elimina una opción de conjunto de opciones y esa opción se usó en un registro eliminado, no se puede restaurar porque la opción ahora no es válida. Antes de eliminar una opción de conjunto de opciones, compruebe que ningún registro use esa opción, incluidos los registros eliminados.
Nombre:
PicklistValueOutOfRangeRecycleBin
Código:0x80049949
Número:-2147182263
Mensaje:Picklist value not valid, please add the invalid value back to the picklist before restoring record
Violación de clave primaria al eliminar
Si el registro con la misma clave principal ya se eliminó antes, se ignora la copia a la papelera de reciclaje para el registro. Para asegurar que todos los elementos eliminados se almacenan en la papelera de reciclaje, puede establecer la configuración DoNotEnforcePrimaryKeyOrgSettingRecycleBin mediante la herramienta OrgDBOrgSettings para Microsoft Dynamics CRM.
Después de habilitar esta configuración, es posible que reciba el siguiente error:
Nombre:
DuplicateExceptionRestoreRecycleBin
Código:0x80049939
Número:-2147182279
Mensaje:A record that has the attribute values Deleted Object already exists on Delete.
Detectar qué tablas están habilitadas para la papelera de reciclaje
Antes de habilitar la característica papelera de reciclaje, la tabla Configuración de papelera de reciclaje (RecycleBinConfig) no tiene filas.
Con el tiempo, esperamos que la mayoría de las tablas estén disponibles para usar la característica de papelera de reciclaje. Los componentes de la solución, las tablas virtuales y las tablas elásticas no se admiten para la papelera de reciclaje. Durante esta versión preliminar, es posible que algunas tablas no habilitadas actualmente estén habilitadas más adelante (por ejemplo, tablas con más de 400 columnas). Para obtener una lista de tablas que no admiten la papelera de reciclaje, consulte Tablas que actualmente no son compatibles con la Papelera de reciclaje.
También puede desactivar la papelera de reciclaje para tablas específicas y desactivar la papelera de reciclaje para el entorno. Si la papelera de reciclaje no está habilitada para una tabla, no podrá encontrar cualquier registro elegible para ser restaurado. Puede consultar Dataverse para averiguar si la papelera de reciclaje está habilitada para una tabla o no.
Las tablas que están habilitadas para la papelera de reciclaje tienen una fila en la tabla RecycleBinConfig donde el statecode está activo y isreadyforrecyclebin es verdadero. La RecycleBinConfig tabla no contiene el nombre de la tabla, pero hace referencia a una fila de la tabla Entity donde la logicalname columna contiene logicalName de la tabla.
Use la siguiente consulta FetchXml para detectar qué tablas tienen habilitada la papelera de reciclaje:
<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>
Aprenda a consultar datos mediante FetchXml
Detectar qué tablas no tienen habilitada la papelera de reciclaje
Para saber qué tablas no están habilitadas para la papelera de reciclaje, use la siguiente consulta FetchXml que es la inversa de la que se encuentra en Detectar qué tablas están habilitadas para la papelera de reciclaje.
<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>
Aprenda a consultar datos mediante FetchXml
Los resultados de esta consulta a partir de mayo de 2024, cuando comenzó esta característica en vista previa, están disponibles en Tablas que actualmente no son compatibles con la Papelera de reciclaje
Recuperar y establecer la configuración del periodo de limpieza automática para la papelera de reciclaje
El valor para determinar cuánto tiempo están disponibles para restaurar los registros eliminados se establece en la columna RecycleBinConfig.CleanupIntervalInDays donde el valor de la columna Name es organization. Cada dos filas en la tabla RecycleBinConfig tiene un valor de columna CleanupIntervalInDays de -1. Este valor indica que usa los mismos valores establecidos para la organization tabla.
Para especificar un valor diferente para otra tabla, establezca el CleanupIntervalInDays valor de columna donde Name coincide con el nombre lógico de la tabla. Esta columna permite valores de hasta 30, se recomienda no establecerlo a menos que sea diferente del valor predeterminado de la organización.
Puede usar este método estático SetCleanupIntervalInDays para establecer el valor de CleanupIntervalInDays columna de una tabla específica.
/// <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.");
}
}
Deshabilitar la papelera de reciclaje para una tabla
Para deshabilitar la papelera de reciclaje de una tabla, deshabilite el registro recyclebinconfig de la tabla configurando las propiedades statecode y statuscode a su valores Inactivo: 2 y 1, respectivamente.
Nota:
Las consultas siguientes comparan el EntityId valor con el valor de columna Entity.EntityId , que almacena la tabla EntityMetadata.MetadataId .
Usa este método estático DisableRecycleBinForTable para desactivar la papelera de reciclaje para una tabla específica.
/// <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);
}
}
Deshabilitar la papelera de reciclaje para el entorno
Nota:
La forma preferida de deshabilitar la papelera de reciclaje para un entorno es desactivarla desde el Centro de administración de Power Platform. El método descrito aquí puede cambiar antes de que la característica esté disponible con carácter general.
Elimine la fila de la tabla RecycleBinConfig donde el name valor es "organization". Esto desencadena la eliminación de todos los registros en la tabla RecycleBinConfig y deshabilita a papelera de reciclaje en el entorno.
Importante
No intente eliminar otros registros individuales. Es importante que Dataverse administre esto.
Administración de la restauración de registros eliminados por lógica de negocios personalizada
Dataverse proporciona un mecanismo para administrar las acciones deseadas para los registros relacionados cuando se elimina una fila. Estos datos de configuración forman parte de la definición de la relación. Cuando se elimina un registro relacionado, hay cuatro comportamientos posibles que puede configurar:
| Comportamiento de eliminación | Description |
|---|---|
| Cascade All | Se eliminan los registros relacionados. |
| Quitar vínculo | Las columnas de búsqueda del registro eliminado se establecen en NULL. |
| Cascade None | No se aplican cambios a los registros relacionados. (Solo interno) |
| Restringir | Dataverse impide eliminar el registro para mantener la integridad de los datos. El registro no se puede eliminar a menos que no haya registros relacionados con esta relación. |
Más información sobre los comportamientos de relación
No hay nada que hacer cuando la relación está configurada para Cascade All, Remove Link y Restrict porque Dataverse administra estos comportamientos.
Si tiene una relación configurada para usar el comportamiento Quitar vínculo , pero se supone que esta relación elimina el registro relacionado, es posible que tenga lógica personalizada que aplique algún comportamiento personalizado. Por ejemplo, puede que desee responder a este comportamiento de forma diferente e implementar su propio comportamiento "Cascade some" en función de las reglas que defina. Por ejemplo, puede eliminar registros inactivos o registros que no se actualizaron en un período de tiempo determinado. Normalmente, esta lógica se implementa mediante un complemento, pero también se puede realizar mediante Power Automate con el conector de Microsoft Dataverse: cuando se agrega, modifica o elimina una fila.
Si tiene este tipo de lógica de negocios personalizada, Dataverse no lo sabe y no puede deshacer automáticamente la lógica. Sin embargo, puede registrar otro complemento en el mensaje Restore para revertir cualquier lógica personalizada que tenga. O bien, puede usar Power Automate y el conector de Microsoft Dataverse: desencadenador Cuando se realiza una acción.
Importante
Tenga cuidado con el contexto al registrar los pasos del plug-in para el mensaje Restore. El registro que se va a restaurar no estará disponible en la PreOperation etapa. Si es necesario crear registros relacionados, use la PostOperation etapa.
Obtenga más información sobre las etapas del plug-in.
Los parámetros InputParameters y OutputParameters del Restore mensaje son similares al Create mensaje, por lo que los complementos escritos que se van a registrar para el Create mensaje se pueden volver a usar para el Restore mensaje con menos cambios.
Actualmente, las tablas no son compatibles con la Papelera de reciclaje
La consulta descrita en Detectar qué tablas no tienen habilitada la papelera de reciclaje se usó para generar esta lista en agosto de 2024.
Consulte también
Restauración de registros de tabla eliminados de Microsoft Dataverse (versión preliminar)