問題
Salesforce Data Loaderでリストメール(ListEmail)を一括削除しようとした際、以下のエラーが発生し削除が完了できない状況に陥りました。
DELETE_OPERATION_TOO_LARGE: Cascade deleting too many records:
occurring when cascading to List Email Sent Results records
occurring when cascading to ToDo records
occurring when cascading to リストメール records
背景
- 削除対象:約1,000件のリストメールレコード
- 初期設定:SOAP API、バッチサイズ200
- 関連レコード:List Email Sent Results、ToDo、関連リストメールが大量に存在
リストメールを削除する際、Salesforceは関連する大量のレコードをカスケード削除しようとするため、システムの制限に引っかかってしまいます。
試行錯誤した解決策
1. API方式の変更(効果なし)
最初にAPI方式を変更してみました。
- SOAP API → Bulk API → Bulk API 2.0
しかし、いずれの方式でも同じカスケード削除制限エラーが発生しました。
2. Hard Delete(物理削除)の試行(効果なし)
ごみ箱をバイパスすることで制限を回避できるか試しました。
権限設定:
- 「Bulk API の物理削除」権限を権限セットで付与
- システム管理者プロファイルがデフォルトのため権限セット経由で対応
結果:
Hard Delete実行後も同じエラーが発生。さらに以下の問題も判明:
INVALID_INPUT: Pardot を介して送信されたリストメールは削除できません
UNABLE_TO_LOCK_ROW: unable to obtain exclusive access to this record
解決策
バッチサイズを大幅に縮小
最終的な成功設定:
- API:SOAP API
- バッチサイズ:10(デフォルト200から大幅縮小)
結果:
- 処理速度:765レコード/時
- エラー率:0%
- 推定完了時間:約107分
バッチサイズを10に設定することで、一度にカスケード削除される関連レコード数が制限内に収まり、エラーなく処理が進行するようになりました。
根拠
なぜバッチサイズ縮小が有効だったのか
-
カスケード削除の仕組み
- 1つのリストメールに対して、関連レコードが数百〜数千件存在
- バッチサイズ200では、200 × 数千件の関連レコードを一度に削除
- これがSalesforceの制限を超えていた
-
制限の回避
- バッチサイズ10では、10 × 数千件程度に削減
- Salesforceの許容範囲内に収まった
-
API方式による差異がなかった理由
- カスケード削除制限は、API方式に関係なくSalesforce側で設定されている
- SOAP、Bulk API、Hard Deleteいずれでも同じ制約が適用される
実装手順
Data Loader設定変更
- Data Loaderの設定画面を開く
- 「Import batch size」を10に変更
- SOAP APIを選択
- 通常のDeleteを実行
処理時間の考慮
- 処理時間は大幅に増加(数時間〜)
- ただし、エラーで停止するリスクを回避できる
- 夜間等での実行を推奨
今後の対応指針
大量削除時のベストプラクティス
-
事前調査
- 削除対象レコードの関連データ量を確認
- カスケード削除されるオブジェクトとその件数を把握
-
段階的アプローチ
- まずはバッチサイズ50程度で試行
- エラーが出る場合は段階的に縮小(20→10→5)
-
時間管理
- 大量データ削除は時間がかかることを前提に計画
- 営業時間外の実行を検討
まとめ
Salesforce Data Loaderでのカスケード削除制限エラーは、API方式やHard Deleteでは解決できませんが、バッチサイズの大幅縮小により確実に解決できます。
処理時間は増加しますが、エラーで作業が停止するリスクを回避でき、最終的にはより効率的な解決策となります。
同様の問題に遭遇した際は、まずバッチサイズを10程度まで下げて試してみることを強く推奨します。