スクラッチ組織で主従関係を扱う時の注意点

スクラッチ組織で主従関係のカスタム項目を持つカスタムオブジェクトを作成し、sfdx force:source:deploy でSandboxに転送するときには注意が必要です。

作成したカスタムオブジェクトの共有設定を見ると、親レコードに連動となっています。

ところが、sfdx force:source:pullでスクラッチ組織から取得すると、カスタムオブジェクトのメタファイル(カスタムオブジェクト名__c.object-meta.xml)の公開/参照・更新可能(sharingModelがReadWrite)となります。

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
 ・・・中略・・・
    <allowInChatterGroups>false</allowInChatterGroups>
    <compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
    <deploymentStatus>Deployed</deploymentStatus>
    <enableActivities>false</enableActivities>
    <enableBulkApi>true</enableBulkApi>
    <enableFeeds>false</enableFeeds>
    <enableHistory>false</enableHistory>
    <enableLicensing>false</enableLicensing>
    <enableReports>false</enableReports>
    <enableSearch>false</enableSearch>
    <enableSharing>true</enableSharing>
    <enableStreamingApi>true</enableStreamingApi>
    <label>Webリード</label>
    <nameField>
        <label>名前</label>
        <type>Text</type>
    </nameField>
    <searchLayouts/>
    <sharingModel>ReadWrite</sharingModel> ← ココ!!
    <visibility>Public</visibility>
</CustomObject>

この状態で、Sandboxにソースを転送すると以下のエラーになります。

Cannot set sharingModel to ReadWrite on a CustomObject with a MasterDetail relationship field

対応するには、カスタムオブジェクトのメタファイルを以下のように修正します。

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
 ・・・中略・・・
    <allowInChatterGroups>false</allowInChatterGroups>
    <compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
    <deploymentStatus>Deployed</deploymentStatus>
    <enableActivities>false</enableActivities>
    <enableBulkApi>true</enableBulkApi>
    <enableFeeds>false</enableFeeds>
    <enableHistory>false</enableHistory>
    <enableLicensing>false</enableLicensing>
    <enableReports>false</enableReports>
    <enableSearch>false</enableSearch>
    <enableSharing>true</enableSharing>
    <enableStreamingApi>true</enableStreamingApi>
    <label>Webリード</label>
    <nameField>
        <label>名前</label>
        <type>Text</type>
    </nameField>
    <searchLayouts/>
    <sharingModel>ControlledByParent</sharingModel> ← ココ!!
    <visibility>Public</visibility>
</CustomObject>

これでSandboxにソースを転送できます。さらにはこのままスクラッチ組織に転送しても問題ありません。

この記事は、sfdxのバージョンがsfdx-cli/7.45.1-bc18d49798のものです。今後、バージョンアップされると解決される可能性があります。