ApexでのProduction/Sandbox判別:クリーンで効率的なコード設計


Apexコードを使用して現在のSalesforce組織が本番環境(Production)なのか、サンドボックス(Sandbox)なのかを判別する方法について解説します。

以前はURLのドメイン名や接頭辞を解析する方法が一般的でしたが、現在では`IsSandbox`フィールドを使用するより効率的でクリーンなアプローチが可能です。


1. `IsSandbox` フィールドの概要

  • `IsSandbox`フィールドは、`Organization`オブジェクトに追加された読み取り専用のフィールドです。
  • 値が`true`ならSandbox環境、`false`なら本番環境であることを示します。

2. `IsSandbox`を使用した判別コード

以下は、`Organization`オブジェクトのクエリを利用して環境を判別する基本的な例です。

// 環境がSandboxかどうかを判別する
Boolean isSandbox = [SELECT IsSandbox FROM Organization LIMIT 1].IsSandbox;

if (isSandbox) {
    System.debug('This is a Sandbox environment.');
} else {
    System.debug('This is a Production environment.');
}

3. トリガー内での使用方法

トリガーや他のApexコード内でこの情報を使う場合は、以下のようにLazy Loader(遅延読み込み)パターンを使用すると効率的です。

public with sharing class OrgUtils {
    private static Boolean isSandbox;

    // 環境判別用のLazy Loader
    public static Boolean runningInASandbox() {
        if (isSandbox == null) {
            // 初回アクセス時にデータをロード
            isSandbox = [SELECT IsSandbox FROM Organization LIMIT 1].IsSandbox;
        }
        return isSandbox;
    }
}

トリガーで利用する場合:

trigger ExampleTrigger on Account (before insert) {
    if (OrgUtils.runningInASandbox()) {
        System.debug('Sandbox環境での処理を実行中');
    } else {
        System.debug('本番環境での処理を実行中');
    }
}

4. 効率性を考慮した最適化

  • SOQLクエリ制限: `IsSandbox`は`Organization`オブジェクトに対するクエリが必要です。これによりSOQL制限が1回消費されます。ただし、このクエリは通常1回限りで済むため、適切に設計すればパフォーマンスへの影響はほぼ無視できます。
  • キャッシュ利用: 結果を静的変数にキャッシュすることで、不要なクエリの実行を防ぎます。

5. 使用例:メール送信の条件分岐

Sandbox環境ではメールを送信しないロジックを構築する例です。

public void sendEmail() {
    if (!OrgUtils.runningInASandbox()) {
        Messaging.SingleEmailMessage msg = new Messaging.SingleEmailMessage();
        msg.setSubject('Production Alert');
        msg.setToAddresses(new List<String>{'admin@example.com'});
        msg.setPlainTextBody('This is a notification from the production environment.');
        Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{msg});
    } else {
        System.debug('Sandbox環境ではメールは送信されません。');
    }
}

6. 判別ロジックの注意点

  1. APIバージョン: クラスまたはトリガーのAPIバージョンが31.0以上であることを確認してください。
  2. クエリ制限: SOQLクエリが必要なため、大量のトリガー実行で制限を超えないように注意してください。
  3. Lazy Loaderの推奨: 繰り返し参照される場合は、Lazy Loaderパターンで効率的にクエリ回数を削減します。

コメント