UserRecordAccess

ユーザの一連のレコードへのアクセスを表します。このオブジェクトは参照のみで、API バージョン 24.0 以降で使用できます。
Salesforce Developer Documentation

参照権限があればリンクを表示、編集権限があれば編集ボタンを表示などカスタム画面を作成する時に役立ちます。
以下の制限があるので注意が必要です。

  • 実行ユーザがレコードのセットに対するユーザのアクセスを照会する場合は、実行ユーザが参照アクセス権を持たないレコードは、結果から除外されます。
    → SOQLの検索結果が0件の時があります。その場合は参照権がないとして処理しましょう。
  • UserId およびRecordId のみを使用して絞り込む場合は、SELECT RecordId および任意で 1 つ以上のアクセスレベル項目 (HasReadAccess、HasEditAccess、HasDeleteAccess、HasTransferAccess、HasAllAccess) を使用する必要があります。MaxAccessLevel を含めることができます。
    → 静的queryであればエラーになるのですぐに気づきます。動的queryの場合もテストクラスを作成する習慣があればすぐ気づけます。
  • UserId、RecordId、およびアクセスレベル項目で絞り込む場合は、SELECT RecordId のみを使用する必要があります。
    → 静的queryであればエラーになるのですぐに気づきます。動的queryの場合もテストクラスを作成する習慣があればすぐ気づけます。
  • 200件までのレコードIdを照会できます。
    → 201件以上の場合は実行時にエラーになります。200件単位に繰り返しquery実行する必要があります。

UserRecordAccessレコードを表示するlightningコンポーネント

使用方法

API バージョン 30.0 以降では、UserRecordAccess はレコードの外部キーになります。このオブジェクトをルックアップまたは外部キーとして使用する場合は、UserId または RecordId 項目を検索条件に使用したり、指定したりすることはできません。
Salesforce Developer Documentation

クエリ対象のユーザが参照アクセス権を持つレコードが返されます。

1
2
3
4
5
SELECT RecordId
     FROM UserRecordAccess
     WHERE UserId = [single ID]
     AND RecordId = [single ID]      //or Record IN [list of IDs]
     AND HasReadAccess = true

ルックアップを使用して、下記のqueryでも実行できます。 しかし、UserRecordAccessを取得した時、どのUserに対するアクセス権なのか不明です。 テストコードでは、System.runAs()で実行ユーザを変更しても取得結果は変わりませんでした。

1
2
3
4
5
6
SELECT 
    Id, Name, 
    UserRecordAccess.HasReadAccess, 
    UserRecordAccess.HasTransferAccess, 
    UserRecordAccess.MaxAccessLevel 
FROM Account

動作がよく分からないので、直接UserRecordAccessをqueryした方が安全ですね。

Last Mod: Mar 14, 2020