はじめに
タイトル通りですが、項目権限をSOQLで取得して権限一覧表を作成するぞ~と思ったら、取得できていない項目がありなぜかしら、、、と調べていったら
原因が分かったのでこちらに残しておきます。
特定の項目の項目権限が取得できない
カスタムオブジェクトのプロファイル、権限セットごとの項目権限を整理しようと思い立ちました。
項目権限はFieldPermissions オブジェクトに格納されます。
以下のようなSOQLを実行しカスタムオブジェクトの項目権限を取得しました。
SELECT Field, PermissionsEdit, PermissionsRead, Parent.Profile.Name
FROM FieldPermissions
WHERE SobjectType = 'CustomObject__c'
結果を確認すると、特定の項目だけどのプロファイル、権限セットにも権限がついていないようなのです。
しかし、設定画面(UI)で項目の「項目レベルセキュリティの設定」を確認すると、どのプロファイルにも編集権限がついています。
なんでだ、、おかしい、、、
調査開始: なぜSOQLで取得できないのか?
通常、項目権限はFieldPermissions オブジェクトに格納されます。
しかし、特定の項目を指定しても、実行結果は0件です。
【試したこと】
- オブジェクト名の確認→問題なし
- Fieldを指定する形式(Object.Field)→問題なし
- 実行ユーザーの権限確認→問題なし
それでも出ません。
発見: 設定画面での変更ができない
再度、設定画面(UI)で項目の「項目レベルセキュリティの設定」を確認すると、あることに気が付きました。
チェックボックスが編集できない
あれれ~…?さらに項目の設定をよく見てみると、
必須項目になっている!
必須ってことは、作成時に編集できないと困りますよね。。。
解説: 必須項目と権限の特殊な関係
Salesforceの保存時に必須な項目には独自の仕様があります。
-
権限の強制
- 「必須」=「入力しないと保存できない」ため、全プロファイルで編集権限が強制(固定)されます。
-
項目権限(FieldPermissions)オブジェクトの仕様
- 項目権限オブジェクトには必須項目のレコードは格納されない仕様となっているようです。
- 公式ドキュメント: https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_fieldpermissions.htm
- 次のデータ型は、常に参照可能および書き込み可能とみなされるため、FieldPermissions レコードは返されません。
- OwnerId
- 主従カスタム (関係) 項目
- 必須カスタム項目
- 次のデータ型は、常に参照可能および書き込み可能とみなされるため、FieldPermissions レコードは返されません。
- 設定画面でのロック
- 「参照のみ」や権限なしに設定できないよう、設定画面上でも読み取り専用となるようです。
さいごに
項目権限(FieldPermissions)オブジェクトで簡単に権限確認ができるぞと思っていたのですが、仕様を把握できておらず罠にはまりました。
「おかしいな?」と思ったら、オブジェクトマネージャーから設定を確認してみるのが、意外と近道かもしれません。