SalesforceのPartial Copy sandboxの罠

記事タイトルとURLをコピーする

こんにちは、CE課(コーポレートエンジニアリング課)の江利です。

まだまだ暑い日が続きますが、皆さんいかがお過ごしでしょうか。

この記事ではいくつかあるSalesforceのsandboxのひとつであるPartial Copy sandboxを利用する際に陥りがちな罠について解説したいと思います。

Partial Copy sandboxとは

Salesforceの開発環境であるsandboxにはいくつか種類があり、その中でも一番ポピュラーなsandboxがDeveloper Sandboxで、すべてのエディションで利用可能で更新間隔は1日でストレージはデータ、ファイル共に200MBまで利用可能です。Enterprise Edition(ほぼ皆さんこちらのエディションかと思います)であれば最大25個まで作成可能です。

sandboxの種類と価格の詳細は公式を参照ください。

help.salesforce.com

www.salesforce.com

Partial Copy sandboxはEnterprise Edition以上であれば無償で1個は利用可能な上位sandboxで更新間隔が5日と長いですが、データストレージは5GB、ファイルストレージは本番組織と同じ要領が利用可能となります。主な用途としては大量データ処理向けのsandboxとなっています。

また、最大の特徴としてテンプレートで設定された各オブジェクトのレコードを本番組織からコピーすることが可能です。Developer SandboxやDeveloper Pro Sandboxではメタデータのみコピーされませんが、Partial Copy sandboxはその名の通り部分的にレコードがコピーされるのです。但し、各オブジェクトの最大コピーレコード数は10,000までとなっています。

例えば本番組織に取引先が12,000レコード、取引先責任者が15,000レコードあった場合に取引先と取引先責任者がテンプレートに含まれている場合であれば取引先が10,000レコードと取引先責任者が10,000レコードコピーされたsandboxが作成可能です。

サンプルデータを作成しなくてもいきなり開発や試験が開始出来ますね。

詳しくはこちらのHelpに記載されています。 help.salesforce.com

気を付けるべきポイント

前述の例で作成されたPartial Copy sandboxの場合であれば取引先12,000レコードのうち2,000レコードと取引先責任者15,000レコードのうち5,000レコードはコピーされません。ここで気を付けるべきポイントですが、各オブジェクトの10,000レコードは任意に選択することが出来ない点です。

どのような現象が起こるのか

ある取引先責任者レコードをSOQLで取得した際に取引先の参照関係にはIDがセットされているように見えるのに、実際にブラウザで対象レコードを確認するとリンクは貼られているが取引先名は表示されずリンクを開くとそんなレコードは無いと怒られてしまいます。

これを知らずに結合テストやってしまうとハマります。何故ならば開発者はSOQLで値がセットされているということはレコードは存在しているものだと認識してしまう生き物だからです。では、何故このよう現象が発生してしまうのか、答えは簡単です。子である取引先責任者のコピー時にはあくまで値をコピーしているだけだからです。

例えば下記のようなSOQLでは意図したレコードが取得できない場合が起こり得ます。

SELECT Id, Name
FROM Account
WHERE Id IN (SELECT AccountId FROM Contact)

なお、下記の場合であればAccountIdは取得可能ですがAccount.Nameはnullとなります。

SELECT Id, AccountId, Account.Name
FROM Contact

親である取引先はコピーされていないが、子である取引先責任者はコピーされている、そんなみなしごハッチ的なレコードが生まれてしまう悲しい世界、それがPartial Copy sandboxなのです。

カスタムオブジェクトの数が極端に多い場合

こちらはかなりのレアケースとなりますがカスタムオブジェクトの数が極端に多く、それぞれのオブジェクトのレコード数も10,000以上の場合にPartial Copy sandboxのデータストレージ容量5GBの上限に達してしまい、そもそもレコードが作成出来ない場合というのが挙げられます。

Partial Copy sandboxが実装されて以来、今のところ私は遭遇したことはありません。

万が一このケースに遭遇するような組織の場合は参照関係の維持が必要なオブジェクトのみテンプレートに入れて、単独で存在しても問題ないマスタデータのようなレコードはデータローダやインポートウィザードを利用するなど少し工夫するようにしてください。

ちなみに、めったに遭遇することは無いのですがsandbox組織では厳格にストレージ容量超過を監視しており、超過時にはSTORAGE_LIMIT_EXCEEDEDのエラーが発生しDML操作に失敗してしまいます。(本番組織ではこちらのエラーは発生しません)

詳しくはこちらのHelpを参照ください。 help.salesforce.com

Full Sandboxではそんなことは起こらない

何故ならばすべてのレコードがコピーされる最強のsandboxだからです。とは言えFull SandboxはEnterprise Editionの場合は有償オプションとなります。更新間隔も29日と長く、本番組織のストレージ利用量が多い場合はコピーにもそれなりに時間がかかるため通常はあまり利用する機会は無いと思います(サーバーワークスもFull Sandboxオプションは利用していません)

とは言えPartial Copy sandboxは便利なので活用してみよう

例えばカスタムオブジェクトに大量のマスタデータが登録されているような組織であれば新たにDeveloper Sandboxを作成したり更新したりする度にデータローダで本番組織からエクスポートしてsandboxにインポートみたいな作業が都度発生してしまいます。正直面倒ですね。また、大量のデータ登録されている状態でしか実行出来ないような非機能試験といった用途であればかなり有用なsandboxだと言えます。データストレージ5GBもあるのでおよそ262万レコードのデータが作成可能です(1レコードあたり2KB換算)テンプレートは複数作成可能ですので是非活用してみてください。

タイトルでは罠と言っていますが、罠だと分かっていればもうそれは罠ではないですよね。この記事がどなたかのsandboxの仕様と上手く付き合ってより良いSalesforce開発を行う一助となれればと思います。

江利 義陽(記事一覧)

CE部CE課でSalesforceエンジニアをやっています。Salesforce歴は12年目くらいなのでチョットだけわかります。
記事への質問やフィードバックは yoshiaki.eri@serverworks.co.jp までお願いいたします。
Trailblazer プロファイル