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