salesoforceのカスタムオブジェクトを一括で全件削除する方法まとめ

開発環境では、Salesforceのオブジェクトを何度か一括で削除する場面があります。

これは、DBでいう、テーブルのTruncateのようなものです。

取引先,リード,活動,取引先責任者,ケース,ソリューション,商品,レポートであれば、管理コンソールの「データの管理」⇒「一括削除」から対象の標準オブジェクトを選択して一括削除できます。

カスタムオブジェクトの場合はどうすればいいでしょうか。

いくつか方法がありますが、制限事項や手間が変わってきますので、目的に応じて適切な方法を選びましょう。

方法①:データローダーで削除する。

以前、この記事「SalesForceのオブジェクトを一括削除する手順」でもご紹介した方法です。

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の使い方ガバナ制限を回避した大量データの一括更新にも便利 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」を使う方法がいいと思います。