SalesforceのBig Objectにはできること、できないことがあります。本記事では、セールスフォースのビッグプロジェクトでサポートされている入力規則、Apex トリガー、ワークフロー、レポートや設定、APIなどの各機能について徹底解説いたします。
Big Objectの各機能一覧
Big Objectの各機能、サポートについて紹介するのは次の通りです。
- 入力規則
- 項目変更履歴
- リストビューでの表示
- Visualforce、Lightning Component
- Apex トリガ
- Apex バッチ
- プロセスビルダー、ワークフロー
- フロー
- レポート
- 権限設定
- API
では詳細を解説していきましょう。
Big Object の機能詳細、サポート状況
Big Object の機能詳細、サポート状況について解説します。
入力規則
カスタムオブジェクトと違い、Big Object では入力規則がサポートされていません。
データの品質は、Apexクラスなどを用いて確保する必要があります。
項目変更履歴
項目変更履歴はサポートされていません。
リストビューでの表示
Big Object はリストビューで表示することができません。
Visualforce、Lightning Component
Visualforce、Lightning Component で Big Object のレコードを表示することは可能です。
前述の通りリストビューが使えないため、Salesforce の UI 上に Big Object のレコードを表示したい場合はこれらを使うことになります。
public with sharing class SampleController {
public List<Purchase_History__b> objList {get; set;}
public SampleController() {
objList = [SELECT Id, Product_Code__c, Product_Name__c, Quantity__c, Unit_Price__c,Contact__c
FROM Purchase_History__b];
}
}
<apex:page id="SampleVF" controller="SampleController">
<apex:pageblock id="ObjList">
<br/>
<apex:pageBlockTable value="{!objList}" var="obj" >
<apex:column value="{!obj.Product_Code__c}"/>
<apex:column value="{!obj.Product_Name__c}"/>
<apex:column value="{!obj.Unit_Price__c}"/>
<apex:column value="{!obj.Quantity__c}"/>
</apex:pageBlockTable>
</apex:pageblock>
</apex:page>
Apex トリガ
Apex トリガは Big Object をサポートしておらず、 Big Object の作成/更新/削除を起点としたトリガを実装することはできません。
trigger SampleTrigger on Opportunity (before insert) {
// トリガ内でBig Object のレコード挿入を試みる
Purchase_History__b obj = new Purchase_History__b();
obj.Product_Name__c = '新商品001';
obj.Product_Code__c = '000001';
Database.insertImmediate(obj);
}
たとえば、商談の登録時にトリガで Big Object のレコード作成を試みた場合、以下のエラーメッセージが表示され、レコードの作成が失敗します。
Apex トリガであるSampleTriggerで予期せぬ例外が発生しました。システム管理者にお問い合わせください。SampleTrigger: execution of BeforeInsert caused by: System.UnexpectedException: BigObjects と sObjects を組み合わせた DML 操作を Apex トリガに含めることはできません。: Trigger.SampleTrigger: line 7, column 1
カスタムオブジェクトを起点とするトリガの中で、非同期Apexを利用して Big Object に対するDML操作を行うことは可能です。
public with sharing class SampleController {
@Future
public static void createBigObjectRecord() {
// 非同期ApexでBig Object のレコード挿入を試みる
Purchase_History__b obj = new Purchase_History__b();
obj.Product_Name__c = '新商品001';
obj.Product_Code__c = '000001';
obj.Contact__c = '0035h00000JPR5UAAX';
obj.Purchase_DateTime__c = Datetime.now();
Database.insertImmediate(obj);
}
}
trigger SampleTrigger on Opportunity (before insert) {
SampleController.createBigObjectRecord();
}
商談を作成して、商談の bofore insertトリガを実行します。
トリガから呼び出された非同期Apexにより、Big Objectのレコードが作成されたことが確認できました。
Apex バッチ
Apex バッチ内の処理で Big Object に対してCRUDを実行することが可能です。
プロセスビルダー、ワークフロー
プロセスビルダー、ワークフローでは Big Object を扱うことはできません。
具体的には、プロセスを実行するタイミングで Big Object の作成または編集を選択することができません。
また、プロセスビルダーのルール適用時のアクションで Big Object のレコード作成・更新を設定することは可能ですが、実行時に「UNKNOWN_EXCEPTION」が発生し、レコードの作成・更新に失敗します。
フロー
フローは Big Object をサポートしておらず、レコードの取得および作成等はできません。
レポート
レポート、ダッシュボードでは Big Object のデータを表示することはできません。
他方、Einstein Analytics は Big Object をサポートしており、データの表示が可能です。
権限設定
Big Object ではオブジェクト権限、項目レベルセキュリティによる権限を設定できます。
共有設定によるレコードレベルの権限設定は使用できません。
API
Big Object は SOAP API および Bulk API をサポートしているため、データローダをはじめとした外部ツールでレコードの作成等が可能です。
また、REST API を介してBig Objectレコードの取得、作成、更新、削除ができます。
おわりに
Big Object は大量データを扱うにあたって利点が大きい反面、Salesforce 標準の自動化処理にほとんど対応していないなど、制限も多い印象です。導入にあたっては、各機能における制限事項を抑えたうえで、要件を実現できるかを慎重に検討する必要がありそうです。