getDeleted()
指定されたオブジェクトについて、特定の期間内に削除された個々のレコードのリストを取得します。
構文
1GetDeletedResult = connection.getDeleted(string sObjectType, dateTime startDate, dateTime EndDate);使用方法
データ複製アプリケーションに getDeleted() を使用すると、指定した期間内に組織のデータから削除されたレコードのリストを取得できます。getDeleted() コールは、使用可能な場合は SystemModstamp システム項目の情報を使用して、GetDeletedResult オブジェクトを取得します。このオブジェクトに含まれる DeletedRecord オブジェクトの配列には、削除された各レコードの ID と、削除された日時 (協定世界時 (UTC) タイムゾーン) が入っています。クライアントアプリケーションで getDeleted() を使用する前に、データ複製に目を通してください(ID についての詳細は、「ID データ型」を参照してください)。
リリース 8.0 現在、getDeleted() コールは、ユーザの共有モデルに従います。
ルールとガイドライン
削除されたレコードを複製する場合、次のルールとガイドラインを考慮してください。
- startDate は、endDate の値より過去の日時でなければなりません。startDate は、endDate と同じか未来の日時であってはなりません。そのような場合、API は INVALID_REPLICATION_DATE エラーを返します。
- レコードは、ユーザがアクセスした場合のみ返されます。
- コールが実行された日から 15 日以内の結果が返されます (管理者がごみ箱の中身を消去した場合、期間が短くなる場合があります)。getDeleted() コールを実行する前に消去処理を実行すると、INVALID_REPLICATION_DATE エラーが返されます。
- latestDateCovered が endDate より前の値の場合、コールは失敗し、latestDateCovered の値と共に INVALID_REPLICATION_DATE エラーが返されます。
-
削除されたレコードは、getDeleted() からアクセス可能な削除ログに出力されます。2 時間ごとに実行されるバックグラウンドプロセスは、削除ログのレコード数が制限を超えた場合、削除ログに書き込まれてから 2 時間以上経過したレコードを消去します。最も古いレコードから順に、削除ログが制限を下回るまで消去を行います。このような処理を行うのは、大量の削除ログによる Salesforce のパフォーマンス上の問題を防ぐためです。制限値は次の数式を使用して算出します。
15000 * number of licenses in the organizationたとえば、1,000 ライセンスを所有する組織では、削除ログのレコード数が 5,000,000 (5 百万) レコード以上になると消去処理を開始します。getDeleted() コールを実行する前に消去処理を実行すると、INVALID_REPLICATION_DATE エラーが返されます。この例外が発生した場合、テーブル全体に対するプル処理を実行する必要があります。
- 大量のデータを削除する場合、すべてのレコードが getDeleted() コールで返されるようにするには、データの複製を 2 時間おきよりも短い間隔で実行する必要があります。
- クライアントアプリケーションは、定期的にデータ変更のポーリングを行います。ポーリング時の重要な検討事項については、「変更のポーリング」を参照してください。
- 特定のオブジェクトのレコードは、API からは複製できません。getDeleted() コールからレコードを複製するには、そのオブジェクトが複製可能に設定されている (replicateable が true) 必要があります。指定されたオブジェクトが複製可能かどうかを確認するには、クライアントアプリケーションでオブジェクトに対する describeSObjects() コールを実行し、replicateable プロパティを確認します。
- 時間データの処理方法は、開発ツールごとに異なります。開発ツールによってはローカル時間を表示するものも、協定世界時 (UTC) を表示するものもあります。開発ツールごとの時間の処理方法はツールのドキュメントを参照してください。
- 履歴オブジェクトの getDeleted() をコールする場合、このコールでは、ユーザが指定した履歴オブジェクトだけではなく、すべての履歴オブジェクトの特定の日付範囲の間に削除されたレコードを返します。たとえば、AccountHistory の getDeleted() をコールすると、AccountHistory、ContactHistory などの特定の日付範囲で削除されたレコードを取得します。ただし、OpportunityHistory に対する getDeleted() コールは削除された OpportunityHistory レコードのみを返し、その他の関連する削除された履歴オブジェクトは返しません。
削除されたオブジェクトを複製するための基本手順
削除されたレコードは、オブジェクトごとに次の基本手順を使用して複製できます。
- (必要に応じて実行) 直近の複製要求以降、オブジェクトの構造が変更されたかどうかを確認します (「オブジェクトの構造変更のチェック」を参照)。
- getDeleted() をコールし、削除されたレコードのオブジェクトと関連する期間を渡します。
- DeleteResult オブジェクトで、返された DeletedRecord オブジェクトの配列を反復処理します。この配列には、削除された各レコードの ID と削除日 (協定世界時 (UTC) タイムゾーン) が含まれます。
- ローカルデータに対して適切なアクションを実行し、削除されたレコードを消去するか、削除済みのフラグを設定します。
- 必要に応じて、今後の参照のために要求の期間を保存します。latestDateCovered の値も保存してください。
クライアントアプリケーションは、データ複製処理に関連付けられた他のタスクを実行することもあります。たとえば、商談がクローズしている場合、クライアントアプリケーションは新たな収益レポートを実行することが考えられます。同様にタスクが完了している場合、プロセスは他のシステムのログに記述することが考えられます。
サンプルコード —Java
このサンプルでは、getDeleted() をコールして、直近の 60 分間に削除されたすべての取引先を取得します。次に、ID および返された各取引先が削除された日付をコンソールに書き込みます。
1public void getDeletedRecords() {
2 try {
3 GregorianCalendar endTime = (GregorianCalendar)
4 connection.getServerTimestamp().getTimestamp();
5 GregorianCalendar startTime = (GregorianCalendar) endTime.clone();
6 // Subtract 60 minutes from the server time so that we have
7 // a valid time frame.
8 startTime.add(GregorianCalendar.MINUTE, -60);
9 System.out.println("Checking deletes at or after: "
10 + startTime.getTime().toString());
11
12 // Get records deleted during the specified time frame.
13 GetDeletedResult gdResult = connection.getDeleted("Account",
14 startTime, endTime);
15
16 // Check the number of records contained in the results,
17 // to check if something was deleted in the 60 minute span.
18 DeletedRecord[] deletedRecords = gdResult.getDeletedRecords();
19 if (deletedRecords != null && deletedRecords.length > 0) {
20 for (int i = 0; i < deletedRecords.length; i++) {
21 DeletedRecord dr = deletedRecords[i];
22 System.out.println(dr.getId() + " was deleted on "
23 + dr.getDeletedDate().getTime().toString());
24 }
25 } else {
26 System.out.println("No deletions of Account records in "
27 + "the last 60 minutes.");
28 }
29 } catch (ConnectionException ce) {
30 ce.printStackTrace();
31 }
32}サンプルコード —C#
このサンプルでは、getDeleted() をコールして、直近の 60 分間に削除されたすべての取引先を取得します。次に、ID および返された各取引先が削除された日付をコンソールに書き込みます。
1public void getDeletedRecords()
2{
3 try
4 {
5 DateTime endTime = binding.getServerTimestamp().timestamp;
6 // Subtract 60 minutes from the server time so that we have
7 // a valid time frame.
8 DateTime startTime = endTime.AddMinutes(-60);
9 Console.WriteLine("Checking deletes at or after: "
10 + startTime.ToLocalTime().ToString());
11
12 // Get records deleted during the specified time frame.
13 GetDeletedResult gdResult = binding.getDeleted("Account",
14 startTime, endTime);
15
16 // Check the number of records contained in the results,
17 // to check if something was deleted in the 60 minute span.
18 DeletedRecord[] deletedRecords = gdResult.deletedRecords;
19 if (deletedRecords != null && deletedRecords.Length > 0)
20 {
21 for (int i = 0; i < deletedRecords.Length; i++)
22 {
23 DeletedRecord dr = deletedRecords[i];
24 Console.WriteLine(dr.id + " was deleted on "
25 + dr.deletedDate.ToLocalTime().ToString());
26 }
27 }
28 else
29 {
30 Console.WriteLine("No deletions of Account records in "
31 + "the last 60 minutes.");
32 }
33 }
34 catch (SoapException e)
35 {
36 Console.WriteLine("An unexpected error has occurred: " +
37 e.Message + "\n" + e.StackTrace);
38 }
39}引数
| 名前 | 型 | 説明 |
|---|---|---|
| sObjectTypeEntityType | string | オブジェクト種別。指定された値は、組織で有効なオブジェクトである必要があります。「sObject」を参照してください。 |
| startDate | dateTime | データを取得する期間の開始日時 (ローカル時間ではなく協定世界時 (UTC))。API は、指定された dateTime 値の秒の値を切り捨てます (たとえば、12:30:15 は 12:30:00 UTC となります)。 |
| endDate | dateTime | データを取得する期間の終了日時 (ローカル時間ではなく協定世界時 (UTC))。API は、指定された dateTime 値の秒の値を切り捨てます (たとえば、12:35:15 は 12:35:00 UTC となります)。 |
制限
結果の GetDeletedResult にはレコード件数の制限があります。
- getDeleted() コールが 600,000 件を超えるレコードを返し、ユーザがシステム管理者の場合、EXCEEDED_ID_LIMIT 例外が返されます。
- getDeleted() コールが 20,000 件を超えるレコードを返し、ユーザがシステム管理者ではない場合、OPERATION_TOO_LARGE 例外が返されます。ユーザが参照可能なデータだけでなく、組織全体で 20,000 件以上のレコードが削除された場合、このエラーが発生することにご注意ください。
開始日と終了日の期間を短くすることでこのエラーを回避できます。