参照関係を主従関係に変更する場合の考慮事項

By | January 10, 2022

前書き

「参照(Lookup)」項目のデータ型を「主従(Master-Detail)」項目に変更した場合の影響に関する簡易まとめ。

あくまで個人で調べた範囲なので、網羅性は保証されないことにご注意ください。

結論

■データ型変更時の影響

・レポートが死ぬ

・従オブジェクト側のOWDが[親レコードに連動]に自動変更される

・従オブジェクト側のレコード所有者が親レコードのレコード所有者に(内部的に)自動変更され、使用不可能(※ページレイアウトから削除され、SOQLなどでも取得不可)となる。

・上記アクセス権に依存したもの(※ユーザコンテクストのビジネスロジック・カスタムコンポーネントなど)があった場合、エラーが発生するリスクがある

■データ型変更の前提条件

・(主従関係に変更予定の)参照項目の値が全てのレコードに入っていること

・データ型変更予定のオブジェクトが主従関係における親の場合、当該オブジェクトに主従関係の項目が別で存在しないこと

変更時の影響1:レポートが死ぬ

「参照関係(Lookup)」を 「主従関係(Master-Detail)」 に変更した場合、当該の項目を利用していたカスタムレポートは下記のエラーが出て利用できなくなります

そのため、データ型を変更する場合、事実上レポートを再作成する必要があるといえます。

なお、データ型を変更した後に再び元の「参照関係」に戻した場合、上記エラーは解消され、元のレポートが利用できるようになります。

ただし、その場合、グルーピングに利用されていた主従関係の親項目は自動的に解除されてしまいます。

Salesforce公式ヘルプの記述は以下の通り。

上述の通り、上記ヘルプ内の「リレーションを元に種別に戻すと、レポートは復元され、また使用できるようになります。」という記述は”完全に元通りになる訳ではない”という意味において誤りです。

変更時の影響2:従オブジェクト側のOWDが[親レコードに連動]に自動変更される

表題の通り、従オブジェクト側のOWDが「親レコードに連動(Controlled by Parent)」に更新されます。

これは下記の例のようにアクセス権が変化する可能性を意味しています。

  • 親レコード側のOWDが「非公開(Private)」の場合:今ままで参照or更新できていたはずのレコードが参照or更新できなくなる
  • 親レコード側のOWDが「公開:参照/更新(Public Read/Write)」の場合:今ままで 参照or更新できなかったはずのレコードが参照or更新できるようになる

変更時の影響3:従オブジェクト側のレコード所有者が親レコードのレコード所有者に(内部的に)自動変更され、使用不可能(※ページレイアウトから削除され、SOQLなどでも取得不可)となる。

こちらも表題の通りです。

これまで「所有者」項目ベースでアクセス権を付与していた場合、データ型変更によってアクセス権が消えてしまいます。

変更時の影響4:アクセス権に依存したもの(※ユーザコンテクストのビジネスロジック・カスタムコンポーネントなど)があった場合、エラーが発生するリスクがある

アクセス権の変化によって、これまで利用できていたビジネスロジックやカスタムコンポーネントでエラーが発生するようになる可能性があります。

変更の前提条件1:(主従関係に変更予定の)参照項目の値が全てのレコードに入っていること

親レコードへの参照がemptyのレコードがあるとデータ型変更時に下記エラーが発生します。

変更の前提条件2: データ型変更予定のオブジェクトが主従関係における親の場合、当該オブジェクトに主従関係の項目が別で存在しないこと

データ型変更予定のオブジェクトが主従関係における親であり、かつ既に別の主従関係項目が存在している場合、新たに二つ目の主従関係を作成する(ようなデータ型変更)はできません。

逆に、データ型変更予定のオブジェクトが主従関係における親であったとしても、他に主従関係の項目がなければ主従関係へのデータ型変更は可能です。

公式ヘルプの記述は以下の通り。

上述の通り(というか実際に環境でテストすればただちに明らかとなりますが)、このヘルプ記事の記載は完全に間違いです。