開発環境では、Salesforceのオブジェクトを何度か一括で削除する場面があります。
これは、DBでいう、テーブルのTruncateのようなものです。
取引先,リード,活動,取引先責任者,ケース,ソリューション,商品,レポートであれば、管理コンソールの「データの管理」⇒「一括削除」から対象の標準オブジェクトを選択して一括削除できます。
カスタムオブジェクトの場合はどうすればいいでしょうか。
いくつか方法がありますが、制限事項や手間が変わってきますので、目的に応じて適切な方法を選びましょう。
方法①:データローダーで削除する。
以前、この記事「SalesForceのオブジェクトを一括削除する手順」でもご紹介した方法です。
SalesForceのオブジェクトを一括削除する手順データローダーを使用し、1回、削除対象のデータをcsvにエクスポートし、それを読み込んで、Id指定で対象のデータを削除します。
あまりに大量のデータですとエクスポートが大変ですが、数万件程度のレコード数であれば、エクスポート項目をIdだけ、もしくはIdと名前だけに絞るなど工夫すれば、それほど時間はかかりません。
また、エクスポート時に条件を絞れば、消す対象のレコードを細かく制御できるのも利点ですね。
方法②:トランケートする。
管理コンソールで、「カスタマイズ」⇒「ユーザインターフェース」に行き、「設定」⇒「カスタムオブジェクトの切り捨てを有効化」にチェックを入れると、カスタムオブジェクトの定義の画面に「切り捨て」ボタンが表示されるようになるります。
英語のページでは「Truncating Custom Objects」と表現されており、文字通り「Truncate」という意味のようです。
ただ、
- カスタムインデックスまたは外部 ID があるオブジェクトは削除できない。
- 削除後、新しいURLになる。(オブジェクトのプレフィクスが変わる。「https://ap2.salesforce.com/01I」といった、オブジェクト固有の3つの文字列も変わる。)
- オブジェクト定義はゴミ箱に残るが、レコードはゴミ箱に行かない。
などいくつか制限事項があります。
詳しくはこの日本語のSalesforceのページで確認してみてください。
なお、私が試したときは、一度ログアウトしてログインしないと「切り捨て」ボタンは表示されませんでした。
方法③:apex batchコードを書いてdeleteする。
簡単なbatch apexのクラスを作り、それを開発者コンソールから実行します。
「apex batch」についての詳しい記事は「ガバナ制限を回避した大量データの一括更新にも便利-Batch Apexの使い方」にもかきましたので、参考にしてください。
ガバナ制限を回避した大量データの一括更新にも便利 Batch Apexの使い方下記コード中では、変数queryに削除したいクラスを抽出するSOQLを記述します。
また、executeメソッドの引数の「List scope」の「MyTran1__c」は、対象のオブジェクトのAPI名に変更してください。
/**
* 指定したカスタムオブジェクトを削除するバッチクラス
*
*/
public with sharing class MyCustom_DeleteBatch implements Database.Batchable<sObject>, Database.Stateful {
/**
* コンストラクタ
*
* @param ctx
* @return なし
* @exception なし
*/
public MyCustom_DeleteBatch(){
}
/**
* バッチ開始処理
*
* @param BC
* @return QueryLocator
* @exception なし
*/
public Database.QueryLocator start(Database.BatchableContext BC) {
System.debug('★★★★start');
// 削除対象データ取得
String query ='SELECT ' +
'Id ' +
'FROM MyTran1__c ' +
' Where IsDeleted = FALSE';
System.debug('★★query: ' + query);
return Database.getQueryLocator(query);
}
/**
* バッチ実行処理
*
* @param BC,scope
* @return なし
* @exception なし
*/
public void execute(Database.BatchableContext BC, List<sObject> scope) {
System.debug('★★★execute');
delete scope;
}
/**
* バッチ終了処理
*
* @param BC
* @return なし
* @exception なし
*/
public void finish(Database.BatchableContext BC) {
System.debug('★★★finish');
}
}
クラスの保存ができたら、下記を開発者コンソールから実行すればOKです。
MyCustom_DeleteBatch batch = new MyCustom_DeleteBatch();
Database.executeBatch(batch, 200);
ガバナ制限が不安な場合は、executeBatchの引数の「200」を調節してみてください。
いかがでしたでしょうか。
開発で、大量なデータを何度も削除する場合は、「方法③」の「apex batch」を使う方法がいいと思います。