このブログでは、技術的な事柄を備忘録として残していきます。
記念すべき1つ目は、Salesforce のデータローダに関するメモです。最近業務でデータインポートする機会がありましたので、そのときに発生したエラーや気付きを残します。
※データローダのバージョンは42

インポートデータが UTF-8 の場合は、BOMを外す

インポートデータが UTF-8 の CSV の場合、BOM が付いていると読み込めません。
なお Excel で UTF-8 の CSV を開くときには、逆に BOM が付いていないと読み込めません。(少なくとも Excel 2010 では)

インポートデータが CSV の場合は、ダブルクォーテーションでデータを囲む

インポートデータが UTF-8 の CSV の場合、内容によるのか必ずそうなのかは不明ですが、ダブルクォーテーションでデータが囲まれていないと、読み込みでエラーが発生します。
追記:やはり必ずしもエラーになるわけではありませんでした。ダブルクォーテーションで囲む、囲まないは統一した方が良さそうです。

作成日と最終更新日をセットするには特別な権限が必要

データの移行では、レコードの作成日と最終更新日を設定したいこともありますが、デフォルトではこれらの項目に値を設定することはできません。
システム権限「**レコードの作成時に監査項目を設定**」が必要になります。
参考:https://help.salesforce.com/articleView?id=000213290&language=ja&type=1

作成日が最終更新日より後だとエラー

当たり前といえば当たり前ですが、作成日が最終更新日より後だと、FIELD_INTEGRITY_EXCEPTION:Last Modified Date ~ というエラーが発生します。
移行元が古いシステムだったり、いいかげんなデータの持ち方をしているシステムだったりすると、必ずしも日時データの整合性の取れた状態になっていないこともありますので、注意が必要です。

DELETE なのに「値を入力してください」エラー

インポートに限った話ではありませんが、DELETE しているのにも関わらず「値を入力してください」というエラーが出ることがあります。
INSERT/UPDATE しているわけでもないのに、と 一瞬混乱してしまいますが、このようなときは、親オブジェクトの必須項目が空になっていないか確認するとよいかもしれません。

1. 親オブジェクトINSERT ※このときは項目Aは必須でなく空を設定
1. 子オブジェクトINSERT
1. 親オブジェクトの項目Aが必須化
1. 子オブジェクトDELETE → そのレコードの親の項目Aが空だとエラー

マッピングファイルは作っておいた方が便利

インポート対象が多い場合、リレーションが複雑な場合は、マッピングファイル(*sdl)を作っておいた方が便利です。

Invalid session id エラー

データローダの画面を開いたまましばらく放置して、そのあとにインポートしようとすると、Invalid session id というエラーダイアログが表示される場合があります。
タイムアウトしているだけなので、一度ログアウトしてから再度インポートすればOKです。

UNABLE_TO_LOCK_ROW エラー

インポート対象が多く、思わず複数台で並列にインポートを実施したところ、 UNABLE_TO_LOCK_ROW というエラーが頻発しました。
関連のあるオブジェクトでは並列のインポートは行なわない方が無難かもしれません。