外部オブジェクト利用時の詰まったポイントを備忘録として記録していきます。
設定時
-
ライセンス
- OData2.0 or 4.0で接続する場合、外部データソース1つにつき1つのsalesforce connectライセンスを消費する
- 組織で複数の外部データソースを設定する必要がある場合は構成に留意する
- ビューごとに参照可・不可を分けたい場合など
- 組織で複数の外部データソースを設定する必要がある場合は構成に留意する
- OData2.0 or 4.0で接続する場合、外部データソース1つにつき1つのsalesforce connectライセンスを消費する
-
PK
- 接続先テーブルで明示的にPKが指定されていない場合、ExternalIdには各カラムを結合したものが設定される様子
- カラム数が多すぎると検証時にエラーになる
- 参照元の項目名がsalesforce側のAPI名称の長さの上限を超えるとPKを設定していても反映されなくなる(恐らく自動で項目名が削られるため)
- 接続先テーブルで明示的にPKが指定されていない場合、ExternalIdには各カラムを結合したものが設定される様子
-
表示ラベル・API名
- 項目名はデフォルトで接続先テーブルのカラム名と同じラベル名・API名が設定される
- API名の設定の問題なのか英数字以外を設定しているとエラーになる
- 項目名はデフォルトで接続先テーブルのカラム名と同じラベル名・API名が設定される
-
同期・検証
- 作成できる外部オブジェクトの上限は200個まで
- 外部データソースの変更は再同期しないと反映されない
- salesforce側で項目のラベル名やデータ型などを変更していても再同期する度に元に戻る
- 参照先項目のデータ型が指定していない場合、salesforce側ではロングテキストエリア(32,000)と判断される
- ビューの中でテーブルの項目同士を結合している場合などは注意が必要
- 未定義の項目数が多すぎると1オブジェクトあたりのロングテキストエリア文字列の上限を超えてエラーになるので注意
実装時
-
Apex
- 1時間あたりに取得または作成される新しい行の上限は10万行まで
- 高データボリュームが適用できないか検討
- データメンテナンスで大量の外部オブジェクトを参照する場合はあらかじめクエリを実行しておくと制限の対象外になる
- IN句で条件指定時、条件が多すぎるとエラーになる可能性がある
- URLパラメータでクエリを指定しているようなのでパラメータが長くなりすぎるとエラーが発生する
- 外部データソースによるかも?
- URLパラメータでクエリを指定しているようなのでパラメータが長くなりすぎるとエラーが発生する
- Group By句など一部の句や集計関数が使えない
- DML操作中に外部オブジェクトに対するクエリを発行するとエラーになる
- クエリを行う度にODataコールアウトが実行されている
- デフォルトだと2,000件までしか結果が返ってこない(サーバ駆動ページングの最大ページサイズ)
- バッチ処理であればQueryLocatorを利用すれば制限を回避可能
- 外部参照関係項目に値を設定する場合、IdではなくExternalIdを設定する
- 1時間あたりに取得または作成される新しい行の上限は10万行まで
-
テストクラス
- 参照のみの外部オブジェクトではレコードをクラス中で作成することができないため、テストデータのインスタンスを作成して引き渡す形で実装する必要がある
- 上記の実装を行っているバッチクラスでstartメソッドがIterableで無い場合、execute用のテストデータが作成できないため、executeメソッド中の処理を外出ししてtestVisibleなメソッドを作成してカバーするかseeAllData=trueを利用する必要がある
- seeAllData=trueは環境内のデータに左右されるので推奨されないと思われる
- Batch.execute(Database.BatchableContext BC, List scope)で直接呼び出してもOK
- 上記の実装を行っているバッチクラスでstartメソッドがIterableで無い場合、execute用のテストデータが作成できないため、executeメソッド中の処理を外出ししてtestVisibleなメソッドを作成してカバーするかseeAllData=trueを利用する必要がある
- 参照のみの外部オブジェクトではレコードをクラス中で作成することができないため、テストデータのインスタンスを作成して引き渡す形で実装する必要がある