Apexの「with sharing」と「without sharing」の徹底解説:シナリオ別の動作と適用例


Apexでの共有設定(sharing設定)は、データアクセスや共有ルールに基づいた制御を行うための重要な仕組みです。以下はその基本的な概念と例をまとめたものです。


1. 共有設定の基本概念

  1. 「with sharing」

    • 目的: 組織全体の既定値(OWD)や共有ルールを適用し、データアクセスを制限します。
    • 補足:
      • オブジェクトレベルセキュリティ(OLS)や項目レベルセキュリティ(FLS)は適用されないため、これらを確認する必要がある場合は`with security_enforced`を使用するか、`Schema`クラスで明示的に確認する必要があります。
  2. 「without sharing」

    • 目的: システムモードでコードを実行し、共有ルールを無視します(全データにアクセス可能)。
  3. 共有設定が指定されていないクラス

    • デフォルトではシステムモードで実行されますが、呼び出し元のクラスの設定(「with sharing」または「without sharing」)に従います。
  4. 内部クラスの動作

    • 外部クラスの共有設定を継承しません。個別に共有設定を指定する必要があります。

2. シナリオ別の挙動

以下に具体例を示し、共有設定の挙動を解説します。

前提: クラスの定義

public with sharing class A {} 
public without sharing class B {}
public class C {} // 共有設定が指定されていないクラス

シナリオ1: `class B extends A`

  • 動作: クラス`B`はクラス`A`の共有設定(「with sharing」)を継承します。
  • 結果: `B`内のコードは「with sharing」で実行されます。

シナリオ2: `class B calls class A`

  • 動作: クラス`B`がクラス`A`のメソッドを呼び出した場合、`A`のメソッドはそのクラスで定義された共有設定(「with sharing」)に従います。
  • 結果: 呼び出された`A`のコードは「with sharing」で実行されます。

シナリオ3: `class C calls class A`

  • 動作: クラス`C`(共有設定なし)がクラス`A`のメソッドを呼び出すと、`A`のメソッドはそのクラスで定義された共有設定(「with sharing」)に従います。
  • 結果: 呼び出された`A`のコードは「with sharing」で実行されます。

シナリオ4: `class C extends class A`

  • 動作: クラス`C`はクラス`A`の共有設定を継承します。
  • 結果: `C`内のコードは「with sharing」で実行されます。

シナリオ5: `class A calls class C`

  • 動作: クラス`A`がクラス`C`のメソッドを呼び出す場合、`C`のコードは共有設定を持たないため、呼び出し元に関係なくシステムモードで実行されます。
  • 結果: 呼び出された`C`のコードは「without sharing」で実行されます。

シナリオ6: `class A extends C`

  • 動作: クラス`A`はクラス`C`の共有設定を継承します。
  • 結果: `A`内のコードは「without sharing」で実行されます。

3. Visualforceコントローラーでの共有設定

  • 標準コントローラー: デフォルトで「with sharing」設定が適用されます。
  • 拡張コントローラー: 拡張先のクラスの共有設定が適用されます。
  • カスタムコントローラー: クラス定義に基づき「with sharing」「without sharing」または非指定で動作します。

4. 応用例: セキュリティと共有設定

実際のユースケースでは、共有設定の適切な指定がデータセキュリティと動作要件の両立に寄与します。特に次のような場面で重要です。

  • 「with sharing」: ユーザのデータアクセスを尊重する必要がある場合(例: ユーザ固有のレコードへのアクセス)。
  • 「without sharing」: 管理者レベルのアクセスが必要なバッチ処理やトリガー。

まとめ

共有設定の理解は、Apexコードのセキュリティとメンテナンス性を高めるために非常に重要です。今回の解説をもとに、各シナリオにおける動作を把握し、具体的なユースケースで最適な共有設定を適用してください。

コメント