- リンクを取得
- ×
- メール
- 他のアプリ
- リンクを取得
- ×
- メール
- 他のアプリ
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. 判別ロジックの注意点
- APIバージョン: クラスまたはトリガーのAPIバージョンが31.0以上であることを確認してください。
- クエリ制限: SOQLクエリが必要なため、大量のトリガー実行で制限を超えないように注意してください。
- Lazy Loaderの推奨: 繰り返し参照される場合は、Lazy Loaderパターンで効率的にクエリ回数を削減します。
コメント
コメントを投稿