こんにちは、にいるです。
Apexのアクセス修飾子「with sharing」と「without sharing」の使い方についてまとめてみました。
・【ヘルプ】with sharing、without sharing、および inherited sharing キーワードの使用
1.with sharingとwithout sharingの使い方
with sharingとwithout sharingはApexで使用するアクセス修飾子です。
これらを使用すると、Apexの実行をユーザモードにするかシステムモードにするかを定義できます。
with sharingだとユーザモードでの実行となるため、共有ルールが適用されます。
without sharingはシステムモードで実行するため、共有ルールは適用されません。
通常、アクセス修飾子がない場合はwithout sharingで実行されます。
使い方の例です。
1 2 3 |
public with sharing class SharingTest // 処理を記載 } |
with sharingを使用した別のクラスから呼び出された場合、そのクラスにもwith sharingが適用されます。
もし、共有ルールを適用しないのであれば、呼び出し先のクラスにwith sharingをつける必要があります。
もし、共有ルールを適用しないのであれば、呼び出し先のクラスにwith sharingをつける必要があります。
2.共有ルールが適用されるかを検証
簡単な取引先リストのVisualforceページを作成して検証してみました。
結果です。
# | アクセス修飾子 | 取引先レコードの件数 |
1 | with sharing | 33件 |
2 | without sharing | 576件 |
with sharingの検証内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public without sharing class SharingTest { List<Account> accList {get; set;} public SharingTest(){ } public List<Account> getAccList(){ List<Account> result; result = [SELECT Id,Name,Owner.Name FROM Account ORDER BY Owner.Name ASC ]; return result; } } |
with sharingの結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public with sharing class SharingTest { List<Account> accList {get; set;} public SharingTest(){ } public List<Account> getAccList(){ List<Account> result; result = [SELECT Id,Name,Owner.Name FROM Account ORDER BY Owner.Name ASC ]; return result; } } |
Visualforceページ
Visualforceは共通です。
1 2 3 4 5 6 7 8 9 10 |
<apex:page controller="SharingTest"> <apex:pageBlock > 件数:{!accList.size}件 <apex:pageBlockTable value="{!accList}" var="a"> <apex:column value="{!a.id}"/> <apex:column value="{!a.Name}"/> <apex:column value="{!a.Owner.Name}"/> </apex:pageBlockTable> </apex:pageBlock> </apex:page> |
3.まとめ
いかがでしたでしょうか。
Visualforceページでレコードのリストを作成しているときは、注意が必要ですね。
Visualforceページでは本来見えないレコードが見えてしまうので、そのページで実行するApexもユーザモードにするならwith sharingが必要です。
あとwithout sharingはwith sharingを上書きするために使用できることも覚えておきたいですね。
皆さんもぜひ色々と試してみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。
ではでは!
コメント