はじめに
初めまして、技術本部 Sansan Engineering Unit Data Hubグループの菊池です。
約6年間Salesforce エンジニアとしてさまざまな経験を積み、2021年1月からSansan株式会社に入社しました。
現在は、営業DXサービス「Sansan」とSalesforce連携を実現する、Data Hub AppExchange Packageの開発/運用・保守をしています。
今回とある調査で初めて知った仕様があったので、本ブログで共有します。
背景
とある調査の中で「取引を開始したリードレコードから取引先責任者レコードを見ようとしたら、エラー画面が表示される」という事象が起きました。
「取引の開始」で作成した取引先責任者レコードが削除されていると思い開発者コンソールで対象のデータを見ると、ConvertedContactId
には値が設定されていました。
そのため、再度開発者コンソールにて、ConvertedContactId
に設定されているIdを基にSOQL(Salesforce Object Query Languageの略。Salesforce オブジェクトクエリ言語のこと)を実行したが、該当の取引先責任者レコードは存在していませんでした。
以上の事象からここで1つの疑問が出てきました。
- 参照関係項目で設定している親レコードを削除したら、通常値がnullになるのに
ConvertedContactId
は何故nullにならないのか
この疑問をSalesforceのサポートに問い合わせして確認してみました。
原因
概要
通常の参照関係項目と「取引の開始」関連項目( ConvertedAccountId
, ConvertedContactId
, ConvertedOpportunityId
)で親レコード削除時のnullになるタイミングが違うことが原因でした。
前提条件
Salesforceのレコード削除には3つの状況があります。
- ごみ箱に入れる(標準画面からの削除など)
- 物理削除待ちレコード(ごみ箱を空にする)
- 物理削除レコード(不定期で実行されている削除プロセス)
それぞれ1. 2.はディスクに残っている(SOQLで取得可能)が、3.はディスク内から削除されている状況になります。
詳細
通常の参照関係項目の親レコードを削除する(ごみ箱に入れる)と、nullになります。
しかし、「取引の開始」関連項目( ConvertedAccountId
, ConvertedContactId
, ConvertedOpportunityId
)は削除しても(ごみ箱に入れる)消えません。
また、ごみ箱を空にしてもnullにはなりません。
「取引の開始」関連項目がnullになるタイミングは、レコードが完全に物理削除されたときになります。
通常の参照関係項目と「取引の開始」関連項目のnullになるタイミングについて以下の表でまとめました。
ごみ箱に入れる | 物理削除待ちレコード | 物理削除レコード | |
---|---|---|---|
通常の参照関係項目 | nullになる | nullになる | nullになる |
「取引の開始」関連項目 | nullにはならない | nullにならない | nullになる |
したがって、通常の参照関係項目と「取引の開始」関連項目では親レコードが削除された際のnullになるタイミングが異なります。
まとめ
「取引の開始」関連項目は、Apex トリガや画面開発で参照する項目ではあるので、その際に注意しないといけない仕様だと思います。
また、本仕様について公式ドキュメントには記載が無い隠れた仕様なので、今後も細かい仕様がわかったらブログにて共有します。