この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

AccessLevel クラス

システムモードやユーザーモードなど、Apex データベース操作を実行するときのさまざまなモードを定義します。

名前空間

System

使用方法

デフォルトでは、Apex コードはシステムモードで実行されます。つまり、コードを実行しているユーザーよりも非常に上位の権限で実行されます。システムモードでは、現在のユーザーのオブジェクト権限と項目レベル権限が無視され、クラスの sharing キーワードでレコード共有ルールが制御されます。ユーザーモードでは、現在のユーザーのオブジェクト権限、項目レベルのセキュリティ、および共有ルールが適用されます。

System.Database および System.Search クラスの DML メソッドの多くには、実行モードを指定する accessLevel パラメーターが含まれています。

この Apex コードを実行するユーザーに Account オブジェクトへの更新アクセス権がない場合、Database.insert() メソッドはエラーを返します。

1List<Account> toInsert = new List<Account>{new Account(Name = 'Exciting New Account')};
2
3List<Database.SaveResult> sr = Database.insert(toInsert, AccessLevel.USER_MODE);
4

一方、次の例は、システムモードで実行するメソッドを示しています。挿入が成功するかどうかは、Apex コードを実行するユーザーに Account オブジェクトへの作成アクセス権があるかどうかによりません。

1List<Account> toInsert = new List<Account>{new Account(Name = 'Exciting New Account')};
2
3List<Database.SaveResult> sr = Database.insert(toInsert, AccessLevel.SYSTEM_MODE);
4

AccessLevel のメソッド

AccessLevel のメソッドは次のとおりです。

withPermissionSetId(permissionSetId) (開発者プレビュー)

権限セット内の指定された権限で実行されるデータベースと検索の操作をサポートします。Apex は、指定された権限セットと実行中のユーザーの権限に従って項目レベルセキュリティ (FLS) とオブジェクト権限を適用します。

機能は、開発者プレビューとして利用できます。機能は、Salesforce がドキュメント、プレスリリース、または公式声明で正式リリースを発表しない限り、正式リリースされません。すべてのコマンド、パラメーター、およびその他の機能は、通知の有無に関わらずいつでも変更または廃止される可能性があります。これらのコマンドまたはツールを使用して開発した機能を本番環境に実装しないでください。「ユーザーモードでの権限セット」機能に関するフィードバックや提案は、Trailblazer Community に投稿してください。

メモ

この機能は、ApexUserModeWithPermset 機能が有効になっているスクラッチ組織で使用できます。この機能が有効になっていない場合、この機能を含む Apex コードは、コンパイルすることはできても、実行することはできません。

署名

public System.AccessLevel withPermissionSetId(String permissionSetId)

パラメーター

permissionSetId
型: String
ユーザーモード DML 操作の実行中は、実行中のユーザーの権限に加え、指定された権限セット内の権限が適用されます。

次の例では、権限セットを指定して AccessLevel.withPermissionSetId() メソッドを実行し、カスタムオブジェクトを挿入します。
1@isTest
2public with sharing class ElevateUserModeOperations_Test {
3    @isTest
4    static void objectCreatePermViaPermissionSet() {
5        Profile p = [SELECT Id FROM Profile WHERE Name='Minimum Access - Salesforce'];
6        User u = new User(Alias = 'standt', Email='standarduser@testorg.com',
7            EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US',
8            LocaleSidKey='en_US', ProfileId = p.Id,
9            TimeZoneSidKey='America/Los_Angeles',
10            UserName='standarduser' + DateTime.now().getTime() + '@testorg.com');
11
12        System.runAs(u) {
13            try { 
14                Database.insert(new Account(name='foo'), AccessLevel.User_mode); 
15                Assert.fail(); 
16            } catch (SecurityException ex) { 
17                Assert.isTrue(ex.getMessage().contains('Account'));
18            }
19            //Get ID of previously created permission set named 'AllowCreateToAccount'
20            Id permissionSetId = [Select Id from PermissionSet 
21                where Name = 'AllowCreateToAccount' limit 1].Id;
22
23            Database.insert(new Account(name='foo'), AccessLevel.User_mode.withPermissionSetId(permissionSetId)); 
24
25            // The elevated access level in not persisted to subsequent operations
26            try { 
27                Database.insert(new Account(name='foo2'), AccessLevel.User_mode); 
28                Assert.fail(); 
29            } catch (SecurityException ex) { 
30                Assert.isTrue(ex.getMessage().contains('Account')); 
31            } 
32            
33        } 
34    } 
35}
36

AccessLevel のプロパティ

AccessLevel のプロパティは次のとおりです。

SYSTEM_MODE

現在のユーザーのオブジェクト権限と項目レベル権限が無視される実行モードです。レコード共有ルールは、クラスの sharing キーワードで制御されます。

署名

public System.AccessLevel SYSTEM_MODE {get;}

プロパティ値

型: System.AccessLevel

USER_MODE

現在のユーザーのオブジェクト権限、項目レベルのセキュリティ、および共有ルールが適用される実行モード。

署名

public System.AccessLevel USER_MODE {get;}

プロパティ値

型: System.AccessLevel