[この記事はプレリリース ドキュメントであり、変更されることがあります。]
ユーザーが削除すべきではないレコードを削除する場合があります。 管理者は、削除されたレコードの保持を有効にして、指定された期間内に削除されたレコードを復元できます。 管理者が削除されたレコードを復元する方法について説明します。
削除されたレコードの保持が有効になっている場合、開発者は Restore メッセージを使用して、指定した期間前に削除されたレコードを復元できます。 期間は最大 30 日間です。
復元できる削除済みレコードを取得する
復元できる削除されたレコードを取得するには、クエリのデータソースを "bin" に設定します。
次の例では、削除されたアカウント レコードを最大 3 つ返します。
SDK を使用する場合は、 FetchXml または QueryExpression を使用してデータを取得できます。
FetchXml を使用してデータを取得する場合は、レコードを取得するときに fetch 要素datasource 属性を 'bin' に設定します。
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);
}
QueryExpression を使用してデータを取得する場合は、レコードを取得するときに QueryExpression.DataSource プロパティを 'bin' に設定します。
static EntityCollection GetDeletedAccountRecordsQueryExpression(IOrganizationService service) {
QueryExpression query = new("account") {
ColumnSet = new ColumnSet("name"),
DataSource = "bin",
TopCount = 3
};
return service.RetrieveMultiple(query);
}
削除されたレコードを復元する
Restore メッセージを使用して、削除されたレコードを復元します。
Target パラメーターは、削除されたレコードへの参照ではありません。 これは完全なレコードであるため、レコードの復元中に列の値を設定できます。
Restore操作中に値を設定してオーバーライドしない限り、元の列の値はすべて復元されます。
注
現時点では、主キー値を使用してのみレコードを復元できます。 代替キーを使用してレコードを復元することはできません。
削除されたレコードを復元する方法は、sdk for .NET API と Web API のどちらを使用しているかによって異なります。
SDK for .NET を使用してレコードを復元する方法は、pac modelbuilder を使用して早期バインド型を生成するか、遅延バインド スタイルを使用しているかによって異なります。
.NET 用 SDK を使用して、遅延バインディングおよび早期バインディングプログラミングについて学習します
早期バインドの例
静的RestoreAccountRecordEarlyBoundメソッドは、RestoreRequest<T> を使用して生成されたAccountクラスと クラスを使用します。
/// <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;
}
遅延バインドの例
静的 RestoreAccountRecordLateBound メソッドは 、OrganizationRequest クラスを使用して Restore メッセージを呼び出し、 Target パラメーターを設定します。
/// <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"];
}
レコードを復元するときのベスト プラクティス
レコードを復元するときは、次の問題を回避してください。
- プライマリ レコードを復元する前に関連レコードを復元する
- レコードの作成時に主キー値を指定しない
- 代替キー値が一致するレコードによって復元がブロックされる
- 削除された選択肢オプションを使用するレコードが復元されない
- 削除時の主キー違反
プライマリ レコードを復元する前に関連レコードを復元する
連鎖関係が削除されたレコードを参照する関連レコードがある場合、復元操作は失敗します。 この問題を回避するには、プライマリ レコードを復元する前に、現在のレコードの削除で削除されなかった関連レコードを常に復元してください。
名前:
RefCannotBeRestoredRecycleBinNotFound
コード:0x80049959
数:-2147182247
メッセージ: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>
レコードの作成時に主キー値を指定しない
レコードを作成するときは、常に Dataverse に主キーを設定します。 削除されたレコードと同じ主キー値を持つ新しいレコードを作成した場合、削除されたレコードを復元することはできません。 削除されたレコードを復元する場合は、最初に新しいレコードを削除します。
名前:
DuplicateExceptionRestoreRecycleBin
コード:0x80044a02
数:-2147182279
メッセージ: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.
代替キー値が一致するレコードによって復元がブロックされる
削除されたレコードと同じ代替キー列の値を持つレコードを作成した場合、削除されたレコードを復元することはできません。 削除されたレコードを復元する場合は、最初に新しいレコードを削除します。
名前:
DuplicateExceptionEntityKeyRestoreRecycleBin
コード:0x80049929
数:-2147182295
メッセージ: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.
削除された選択肢オプションを使用するレコードが復元されない
オプション セット オプションを削除し、そのオプションが削除されたレコードで使用されていた場合、そのオプションが無効になったため、レコードを復元できません。 オプション セット オプションを削除する前に、削除されたレコードを含め、そのオプションを使用するレコードがないことを確認します。
名前:
PicklistValueOutOfRangeRecycleBin
コード:0x80049949
数:-2147182263
メッセージ:Picklist value not valid, please add the invalid value back to the picklist before restoring record
削除時の主キー違反
同じ主キーを持つレコードが既に存在する場合、何も起こりません。 削除されたすべてのアイテムを記録するには、Microsoft Dynamics CRM の OrgDBOrgSettings ツール を使用して、DoNotEnforcePrimaryKeyOrgSettingRecycleBin 設定を行います。
この設定を有効にすると、次のエラーが表示されることがあります。
名前:
DuplicateExceptionRestoreRecycleBin
コード:0x80049939
数:-2147182279
メッセージ:A record that has the attribute values Deleted Object already exists on Delete.
削除されたレコード保持が有効になっているテーブルを検出する
この機能を有効にする前に、 削除済みレコード保持構成 (RecycleBinConfig) テーブル には行がありません。
時間の経過と同時に、ほとんどのテーブルでは削除されたレコードの保持がサポートされます。 ソリューション コンポーネント、 仮想テーブル、 エラスティック テーブル は、削除されたレコード保持ではサポートされていません。 現在有効になっていない一部のテーブルは、後で有効になる場合があります (たとえば、600 列を超えるテーブル)。 この機能をサポートしていないテーブルの一覧については、「 現在サポートされていないテーブル」を参照してください。
環境の 削除済みレコード保持を無効にすることもできます。 削除されたレコード保持がテーブルに対して有効になっていない場合、 復元対象のレコードは見つかりません。 Dataverse にクエリを実行して、削除されたレコードの保持がテーブルに対して有効になっているかどうかを調べます。
削除されたレコードの保持が有効になっているテーブルの RecycleBinConfig テーブルには、 statecode がアクティブで、 isreadyforrecyclebin が true である行があります。
RecycleBinConfig テーブルにはテーブルの名前は含まれませんが、Entity テーブル内の行を参照します。この場合、logicalname列にはテーブルの LogicalName が含まれます。
次の FetchXml クエリを使用して、削除されたレコード保持が有効なテーブルを検出します。
<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>
FetchXml を使用してデータのクエリを実行する方法について説明します
削除されたレコード保持が有効になっていないテーブルを検出する
削除されたレコード保持が有効になっていないテーブルを確認するには、次の FetchXml クエリを使用します。これは、 有効になっているテーブルの検出に関するドキュメントの逆です。
<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>
FetchXml を使用してデータのクエリを実行する方法について説明します
この機能が開始された 2024 年 5 月時点のこのクエリの結果は 、削除されたレコードの保持が現在サポートされていないテーブルにあります。
削除されたレコードを保持するための自動クリーンアップ期間の構成を取得して設定する
[名前] 列の値がされている organization 列で、削除されたレコードを復元できる期間を決定する値を設定します。
RecycleBinConfig テーブルの 1 行おきに、CleanupIntervalInDays 列の値 -1 が含まれます。 この値は、 organization テーブルに設定されているのと同じ値を使用したことを示します。
別のテーブルに別の値を指定するには、CleanupIntervalInDaysがテーブルの論理名と一致するName列の値を設定します。 この列は、最大 30 個の値を受け入れます。 組織の既定値とは異なる値を使用する場合を除き、この値を設定しないでください。
この静的 SetCleanupIntervalInDays メソッドを使用して、特定のテーブルの CleanupIntervalInDays 列の値を設定します。
/// <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.");
}
}
.NET 用 SDK を使用します
環境の削除済みレコード保持を無効にする
注
環境の削除されたレコード保持を無効にする方法として、 Power Platform 管理センターで無効にすることをお勧めします。 この機能が一般公開される前に、ここで説明する方法が変更される可能性があります。
値がnameされている organization テーブルの行を削除します。 このアクションにより、 RecycleBinConfig テーブル内のすべてのレコードが削除され、環境の削除されたレコード保持が無効になります。
Important
他の個々のレコードを削除しないでください。 Dataverse がこのアクションを管理することが重要です。
カスタム ビジネス ロジックによって削除されたレコードの復元を管理する
Dataverse には、行が削除されたときに関連レコードに対して必要なアクションを管理するメカニズムが用意されています。 この構成データは、リレーションシップの定義の一部です。 関連レコードが削除されると、次の 4 つの動作を構成できます。
| 動作の削除 | Description |
|---|---|
| すべてカスケード | 関連レコードを削除します。 |
| リンクの解除 | 参照列を削除されたレコードに null に設定します。 |
| カスケードなし | 関連レコードに変更を適用しません。 (内部のみ) |
| 制限 | データの整合性を維持するためにレコードを削除できないようにします。 このリレーションシップに関連するレコードがない限り、レコードを削除することはできません。 |
Cascade All、Remove Link、または Restrict のリレーションシップを構成すると、Dataverse はこれらの動作を管理します。追加の操作はありません。
[リンクの削除] 動作を使用するようにリレーションシップを構成したが、リレーションシップが関連レコードを削除することが想定されている場合は、カスタム動作を適用するカスタム ロジックが必要になる場合があります。 たとえば、この動作に異なる方法で応答し、定義したルールに基づいて独自の "Cascade some" 動作を実装することができます。 たとえば、一定期間更新されなかった非アクティブなレコードやレコードを削除できます。 このロジックは通常、プラグインを使用して実装されますが、Microsoft Dataverse コネクタでPower Automateを使用して実行することもできます。行が追加、変更、削除されたトリガーの場合。
この種のカスタム ビジネス ロジックがある場合、Dataverse はそれについて認識せず、ロジックを自動的に "元に戻す" ことができません。 ただし、 Restore メッセージに別のプラグインを登録して、カスタム ロジックを元に戻すことができます。 または、Power AutomateとMicrosoft Dataverse コネクタ:「アクションが実行された時にトリガーされる」を使用することもできます。
Important
Restore メッセージのプラグイン ステップを登録するときは、コンテキストに注意してください。 復元するレコードは、 PreOperation ステージでは使用できません。 関連レコードを作成する必要がある場合は、 PostOperation ステージを使用します。
プラグイン ステージの詳細を確認します。
メッセージの InputParameters と Restore は、Create メッセージに似ているため、Create メッセージに登録するために書き込まれたプラグインは、変更を少なくしてRestore メッセージに再利用できます。
削除されたレコードの保持に現在サポートされていないテーブル
「 有効になっていないテーブルを検出する 」で説明されているクエリは、2024 年 8 月に この一覧 を生成するために使用されました。