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

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

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

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

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

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

 

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

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

データローダーを使用し、1回、削除対象のデータをcsvにエクスポートし、それを読み込んで、Id指定で対象のデータを削除します。

あまりに大量のデータですとエクスポートが大変ですが、数万件程度のレコード数であれば、エクスポート項目をIdだけ、もしくはIdと名前だけに絞るなど工夫すれば、それほど時間はかかりません。

また、エクスポート時に条件を絞れば、消す対象のレコードを細かく制御できるのも利点ですね。

 

方法②:トランケートする。

管理コンソールで、「カスタマイズ」⇒「ユーザインターフェース」に行き、「設定」⇒「カスタムオブジェクトの切り捨てを有効化」にチェックを入れると、カスタムオブジェクトの定義の画面に「切り捨て」ボタンが表示されるようになるります。

nnn3

 

 

英語のページでは「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<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」を使う方法がいいと思います。

 

追記

上記で、「expecting a left angle bracket, found ‘scope’」といったエラーが出る場合は、<と>を半角に変更してください。

「apex batch」についての詳しい記事は「ガバナ制限を回避した大量データの一括更新にも便利-Batch Apexの使い方」にもかきましたので、参考にしてください。

 



こんな記事も関係あるかも。読んでみてね。

コメントを残す

サブコンテンツ

このページの先頭へ