Force.com データベースの概要

摘要

データの永続化は、多くのアプリケーションにとって中核的な要素です。Force.com プラットフォームには、強力で直観的なデータ永続層である Force.com データベースが用意されています。Force.com データベースは、永続オブジェクトを生成する機能のほか、永続オブジェクトを処理するユーザインターフェースを自動生成する機能など、さまざまなデータベースサービスを提供します。レポート作成、タグ付けをはじめとする多彩な関連機能をアプリケーションに追加して、Force.com プラットフォームでシームレスに利用することも可能になっています。

永続オブジェクトは、Force.com が提供する Web ベースの設定ツール Force.com Builder から作成、設定、実装できます。また、Force.com データベースでは Apex プログラミング言語との緊密な連携も実現されており、専用の構文を使用して、検索処理の実行や検索結果に対する反復処理を行うことができます。

このドキュメントでは、Force.com データベースが提供するデータベースサービスを概説し、利用可能な機能の概要をご紹介します。最初にこのデータベースサービスの基盤となる要素、データ型、サポートしているリレーション、クエリ言語などについて説明した後、永続オブジェクトにもとづいてアプリケーションを自動生成する宣言型の Force.com 環境 Force.com Builder を紹介します。最後に、Apex と Force.com データベースの連携について解説します。


Force.com データベースのデータベースサービスの基盤

Force.com プラットフォームには、アプリケーションの迅速な開発を可能にする数々の機能を備えた強力な Force.com データベースが用意されています。このデータベースは、ユーザインターフェースの自動生成 (詳細は次のセクションを参照) のほか、さまざまな便利な機能を備えています。たとえば、ユーザは外部キーを使用する代わりに、高度に抽象化された使いやすいリレーションを利用できます。このセクションでは、Force.com データベースのデータベースサービスの基本概念、用語を解説します。


オブジェクトとテーブル

リレーショナルデータベースでは、データをテーブルに保存します。各テーブルには特定のデータ型を割り当てられた複数の列が存在し、情報はテーブルの行に保存されます。また、プライマリキーと外部キーを使用して、あるテーブルの行を別のテーブルの行に対応付けることにより、テーブル間のリレーションを設定します。

それに対して Force.com データベースでは、データをオブジェクトに保存します。オブジェクトはテーブルと同等以上の機能を備えていますが、テーブルとは異なる点がいくつかあります。たとえば、オブジェクトは複数の項目で構成されます。オブジェクトを別のオブジェクトに関連付けるには、項目のデータ型で参照関係を指定します。これにより各オブジェクトのレコード間にリレーションが設定されます。オブジェクトの属性はすべてメタデータ (詳細は後述) として記述され、情報はオブジェクトのレコードに格納されます。

オブジェクトを Apex 言語で利用する場合には、Apex クラスのインスタンスと区別するために「sObject」という呼称を使います。このドキュメントでも「sObject」という呼称を使用します。


リレーションを含まないデータ型

オブジェクトに項目を追加する場合は必ず特定のデータ型を指定します。Force.com ではさまざまなデータ型をサポートしています。次にそのリストを示します。

  • 自動採番 - システムによって生成される読み取り専用の連番。SQL の ID 型に似ています。このデータ型を指定した項目は、内部的なオブジェクト ID とは独立した ID を割り当てるために使用されます。オブジェクトのリレーションを作成する目的では使用されません。
  • チェックボックス - Boolean 型のデータに使用します。
  • 日付、日付/時間 - それぞれ、日付、および日付と時間の組み合わせに使用します。
  • 数値 - 実数のデータに使用します。オプションで小数点の桁数を指定できます。
  • 電子メール、電話、URL - それぞれ、有効な書式を持った電子メール、電話、URL の文字列に使用します。
  • 選択リスト、複数選択リスト - リスト内の値に使用します。
  • テキスト、テキストエリア - さまざまな長さのテキストに使用します。
  • 通貨 - 通貨形式を持った数値型。必要に応じて複数の通貨に対応できます。
  • 数式 - 数式の計算結果を格納する読み取り専用の項目です。

ほとんどのデータ型は特に目新しいものではありません。テキスト、自動採型、数値などの基本的なデータ型は、多くのリレーショナルデータベースでも使用されています。ただし、数式は他のデータ型とはやや異なっており、値は設定せず、指定された数式の計算結果から自動的に取得します。取得先の項目の値が変更されるとこの項目の値も更新されます。数式については後ほど詳しく説明します。

また、チェックボックス、電子メール、URL、電話のデータ型を持つ項目には、自動生成されたユーザインターフェース上で自動的に書式を設定する機能があります。


リレーションをサポートするデータ型

Force.com データベースでは、リレーショナルデータベースとは異なる方法でレコードを関連付けます。キー、外部キー、プライマリキーを使用する必要はなく、項目でリレーションをサポートするデータ型を指定します。その項目にはリレーションの親となるレコードの ID が格納されます (詳細は後述)。また、オプションで、親と子双方のレコードのユーザインターフェースを設定できます。

このデータ型には次の 2 種類があります。

  • 参照関係 - 任意のオブジェクトを別のオブジェクトにリンクさせるリレーションを作成します。このデータ型を指定した項目を使用すると、任意のオブジェクトのレコードから、リレーションを設定した別のオブジェクトのレコードを利用できます (GUI、コードの双方で利用可能)。
  • 主従関係 - 2 つのオブジェクト間に親子関係のある特別なリレーションを作成します (子: 「従」、親: 「主」となります)。この場合、a) 子レコードには必ず主従関係のデータ型を持つ項目が必要、b) 該当の項目でいったん保存した値はそれ以降変更できない、c) 親レコードを削除すると、連動して子レコードも削除される、といった点に注意する必要があります。

これらの項目では、1 対 1 および 1 対多のリレーションを作成できます。主従関係は、2 つのオブジェクトが緊密に連携する場合に適しています。例として、ブログとブログの投稿記事というリレーションを考えてみましょう。ブログを削除した場合、ブログの記事も削除する必要があるため、この 2 つは主従関係にあると言えます。また、主従関係は多対多のリレーションもサポートします。この場合は、主従関係にある 2 つのオブジェクトとリレーション関係にある接続オブジェクトを使用します。

主従関係で親となるオブジェクトには積み上げ集計項目を格納できます。この項目には、子レコードの値の集計が保存されます。積み上げ集計項目を使用すると、子レコードの数を数えたり、子レコード内の項目の合計値を求めたり、子レコードを絞り込んで特定の項目の最大値や最小値を求めたりできます。


ID 用の項目

他のデータベースを使い慣れている方は、Force.com データベースでプライマリキーや ID の列が見当たらないことに驚かれるかもしれません。Force.com データベースでは、すべてのオブジェクトに ID 用の項目を自動的に設定し、すべてのレコードで ID データを管理しています。

この ID には、通常 15 文字 (大文字/小文字を区別) の文字列が割り当てられます。Force.com プラットフォームの使用時にご覧になっているかもしれませんが、たとえば、レコードの詳細ページには、次のような URL が設定されています。

 https://na3.salesforce.com/0015000000Gv7qJ

この「0015000000Gv7qJ」がレコードの ID です。アプリケーションで使用するすべてのレコードが ID を持つため、すべてのオブジェクトのあらゆるレコードを上記のような URL で表示できます。Force.com プラットフォームは、ID を含んだレコードと関連するメタデータを自動的に取得し、自動生成したユーザインターフェースにそのレコードを表示します (ユーザがレコードに対する適切なセキュリティ権限を持っていることが前提となります)。


システム用の項目

オブジェクトには、読み取り専用である複数のシステム用の項目が自動的に関連付けられます。前述した ID 用の項目もそのひとつですが、他には次のような項目があります。

  • CreatedDate - オブジェクトの作成日時
  • CreatedById - オブジェクトを作成したユーザの ID
  • LastModifiedById - オブジェクトを最後に変更したユーザの ID
  • LastModifiedDate - ユーザによってオブジェクトが最後に変更された日時
  • SystemModStamp - ユーザやプロセスが実行したプログラム的な処理 (トリガなど) によってオブジェクトが最後に変更された日時

オブジェクトが作成、変更されると、Force.com データベースは上記の項目の値を自動的に取得します。


名前用の項目

オブジェクトの名前 (必須項目) は、オブジェクトのライフサイクルにおける特別な要素です。レコードの名前は、ユーザがレコードを容易に識別するための手段となります。一意である必要はありませんが、ユーザがレコードを特定しやすくするために、なるべく名前を指定してください。自動生成されるユーザインターフェースでは、この項目の値がレコード自体へのリンク (クリックするとレコードの詳細ページに移動します) として表示されます。

この項目には、テキストまたは自動採番のデータ型を指定できます。自動採番の場合は、表示形式と開始番号を指定する必要があります。自動採番では、新しいレコードが作成されるたびに 1 つずつ値が増加します。


その他のデータベースサービス

Force.com データベースは、ユーザのデータを格納するというサービスの他にプログラム、Web サービス、ユーザインターフェースなどに関するさまざまなサービスを提供します (詳細は後述)。続いて、その一部を簡単に紹介します。

  • 数式 - スプレッドシートの数式のように動作し、既存項目の値と指定された演算子を用いて計算を実行します。これは計算のほか、文字列、日付、数値、正規表現を処理することが可能な高度な式言語です。次に、数式項目の例を示します。
 IF(ISPICKVAL( Contract_Status_c , "Activated"), NOW() - Contract_Activated_Date_c , null)

この数式では、契約 (Contract) が有効になってから経過した日数を計算します。既存項目 (Contract_Status__c) が参照され、数式演算子や IFISPICKVALNOW などの関数が使用されています。

  • 入力規則 - 入力規則により、誤ったデータが保存されることを回避できるため、データの質が向上します。この入力規則では、数式項目と同じ構文を使用して、レコード保存時に入力内容を検証する式を定義します。式が「False」を返すと保存処理が中止され、エラーメッセージが表示されます。入力規則は 1 つまたは複数定義することが可能です。各規則にはエラー条件 1 つと対応するエラーメッセージを含めます。入力規則により、数値の範囲を指定して、その範囲外の数値が入力されないようにすることなどが可能になります。
  • トリガ - Apex 言語で記述され、レコードの保存、更新、削除処理の前後に実行できます。詳細は、 Apex とトリガセクションで説明します。
  • 表示ラベル、ヘルプ - すべてのオブジェクトとレコードには表示ラベルが割り当てられます。また、ユーザ用の説明やヘルプを追加することも可能です。これらは、ユーザインターフェースに自動的に組み込まれます。
  • メモ、添付ファイル - [メモ & 添付ファイル] 関連リストが有効化されているオブジェクトのレコードでは、メモの作成、表示、編集を行ったり、添付ファイルを追加したりできます。ユーザは、レコードに対してテキストで自由にメモを追加したり、関連ドキュメントをアップロードしたりできます。
  • 項目履歴管理 - オブジェクトの特定の項目の履歴を追跡できます。この機能を有効化した項目では、値が変更されると、リストが自動的に更新され新しいエントリが追加されます。このリストには、変更が行われた日付、時間、変更内容、変更を行ったユーザが記録されます。
  • セキュリティ - Force.com データベースには、オブジェクト、レコード、項目などへのユーザのアクセス権限を制御できる柔軟なセキュリティモデルが備わっています。詳細は、 データのセキュリティセクションを参照してください。

これらは基本的に、オブジェクトで該当の機能を有効化して設定するだけで使用可能になります。

オブジェクトとは、格納したい項目を記述するための機能ですが、そこにとどまらず、項目やレコードに追加したい機能、項目やレコードの表示方法、使用方法、表示方法などを記述するメタデータの「入れ物」という役割も果たします。

この後は、データベースをサポートする Force.com プラットフォームネイティブの GUI である Force.com Builder、そして、プログラム的にデータベースを処理する Apex について、順を追って説明します。


Force.com Builder でのデータベースサービスの使用

Force.com Builder は、オブジェクトの作成や Force.com プラットフォームの諸機能 (ワークフロー、Web サービス、電子メールサービスなど) の設定を行える、宣言型の Web インターフェースです。Force.com Builder では、メタデータを作成し、そのメタデータを使用して、ユーザが作成したオブジェクトごとにデフォルトのユーザインターフェースを生成します。そのユーザインターフェースでは、オブジェクトのレコードのリストや詳細を確認できるほか、レコードの作成、編集、削除を実行できます。ユーザはこの宣言型のツールを使用して、コードを使うことなく永続層を含むアプリケーション全体を開発できます。コードを使った方法については、 Apex セクションで説明します。

このセクションでは、実際のスクリーンショットを豊富に交えて Force.com Builder環境をご紹介します。この環境を使用して開発したアプリケーションのページもご覧いただけます。


サンプルシナリオ

今回は、TodoList と TodoItem という 2 つのシンプルなオブジェクトを使って説明を進めます。TodoItem には TodoList を参照する項目が含まれています。また、この TodoItem には日付型の [期日]、テキストエリア型の [説明] という項目も含まれています。次の図は、このデータモデルを示したものです。

Db datamodel.jpg

Force.com Builder 環境では、簡単なマウス操作によってこの 2 つのオブジェクトをわずか数分で作成できます。


生成されたユーザインターフェース

続いて、生成されたユーザインターフェースを見てみましょう。ここでは 2 つのオブジェクトを作成した後、レコードにデータをいくつか設定したほかは何も行っていません。

各オブジェクトに対しては「ビュー」というリストが自動生成され、このページがオブジェクトに関連付けられたタブのホームページとして使用されます。次の図は、ビューが表示された TodoList オブジェクトのホームページです。最近アクセスしたレコードがリストされています。

Db list page.jpg

オブジェクトのビューではさまざまな表示が可能であり、既存のビューを変更したり新たにビューを作成したりできます。たとえば、上の図の [GO] ボタンを押すと、次のページが表示されます。

Db list alternate.jpg

このページでは必要なレコードにスムーズにアクセスすることができます。ボタンのクリックでレコードを作成できるほか、リスト上の複数のレコードに対して同時に処理を実行できます。次の図は、TodoList オブジェクト用に生成されたデフォルトの入力ページです。ユーザはこのページで新しいレコードを作成できます。

Db list default entry.jpg

赤いバーは、その項目の入力が必須であることを示します。「Business List」という名前を入力して保存すると、次のような TodoList レコードの詳細ページが表示されます。

Db detailpage.jpg

このページには編集、削除、コピー用のボタンがあらかじめ用意されています。そのほか、オブジェクトで自動的に生成される標準項目である最終更新者、作成者、所有者などの情報が取得されています。作成者、最終更新者の項目はすべてのオブジェクトに対して作成され、自動的に値が設定されます。

続いて、TodoItem レコードの作成によって生成されたページをご覧ください。

Db todoitemcreation.jpg

生成されたユーザインターフェースでは、各項目のデータ型にもとづいて、適切な入力コンポーネントを表示します。たとえば、データ型が日付である項目にはポップアップでカレンダーが表示されています。なお、TodoItem は TodoList と 1 対多の関係にあるため、このページから TodoListレコードを検索することができます。[TodoList] 項目の隣にある検索アイコンをクリックするとダイアログボックスが表示され、この TodoItem レコードを関連付けたい TodoList レコードを検索できます。

次に、データ入力済みの TodoItem レコードの詳細ページを示します。

Db todoitem detail.jpg

他のレコードの名前には、自動的にハイパーリンクが設定されます。たとえば、ここで [Home List] リンクをクリックすると、[Home List] の詳細ページにリダイレクトされ、リレーション先の項目に直観的にアクセスできます。Force.com Builder は、各オブジェクトのページだけでなく、ページ間のナビゲーションも作成します。親レコードの詳細ページに子レコードを一覧表示することも可能です。子レコードを表示した詳細ページの例を次に示します。

Db todochildren.jpg


サイドバーのメニュー、検索、レポート、タグ付け

Force.com で開発したアプリケーションには、デフォルトで次の図のようなサイドバーが表示されます。

Db sidebar.jpg

ここではさまざまなオブジェクトのアイテムのリストから、最近使用したアイテムにすばやくアクセスできます。さらに、データベース内のあらゆるオブジェクトを対象に検索を実行することも可能です。サイドバーは構成の変更が可能で、特定のオブジェクトのレコードを新規作成する機能を追加することもできます。

オブジェクトにはタグを設定することができます。タグ機能を有効化することにより、レコードに新たにタグを追加したり、既存のタグを変更したりできるようになります。

Db todoitem detail tags.jpg

タグ機能を有効化すると、タグが付けられている他のレコードを検索することができるほか、タグを公開して、レコードへのアクセス権限を持つあらゆるユーザが自由にタグを追加できるようにすることも可能になります。

Force.com Builder には、高度なレポート作成機能が備わっています。表形式レポート、マトリックスレポート、サマリーレポートといったさまざまな形式のレポートを作成できるほか、棒グラフや円グラフを使用してデータを視覚的に表現することも可能です。

Db reports.jpg


ユーザインターフェースの変更

生成されたユーザインターフェースは、ページレイアウトを変更することによってカスタマイズできます。各オブジェクトの編集ページ、詳細ページのほか、検索など、さまざまな処理で使用されているページも変更できます。大規模な変更を行う場合は、Force.com プラットフォームのユーザインターフェース層である Visualforce を使用してカスタムのページを作成できます。


Apex

Apex 言語は、Force.com データベースと緊密に連携しています。このセクションでは、Apex 言語を使用してオブジェクトを作成、保持、更新する方法、クエリを実行しその結果に対して反復処理を行う方法、トリガを作成する方法などを解説します。Apexの概要Apex Language Reference (Apex 言語リファレンス) では、さまざまな具体例を取り上げて紹介しています。

sObject の操作

「sObject」とは、あらゆる永続オブジェクトで使用できる汎用的な抽象型の名称です。Apex 言語では、このような永続オブジェクトを第一級オブジェクトとして扱えるため、データベースの連携処理をきわめて直観的かつ簡単に行うことができます。たとえば、namebillingcity という項目を持つ Account オブジェクトの場合、次のいずれの行を実行しても、sObject が作成されます。

 sObject s = new Account(); 
 Account a = new Account( name='Acme', billingCity='Edinburgh') 

後ろの行では、オプションとして項目の初期値が設定されています。Apex では、ドット (.) 表記を使用してオブジェクト内の項目に容易にアクセスすることができます。たとえば次の例は、Account オブジェクトの ID と文字列を返します。

 ID id = a.ID; String x = a.name; 


クエリと埋め込みクエリ

Force.com プラットフォームでは 2 種類のクエリ言語をサポートしています。

  • Salesforce Object Query Language (SOQL) - クエリ専用の言語です。SQL に似ている面もありますが、結合ではなくリレーションを使用するオブジェクトクエリ言語である点が異なっており、データをより直観的に操作することができます。後ほど、具体的な例をご紹介します。
  • Salesforce Object Search Language (SOSL) - すべての永続オブジェクトを対象に検索を実行するシンプルな言語です。

この 2 種類のクエリ言語は、ともに直接 Apex コードに埋め込むことが可能です。たとえば、次のコードでは、name 項目の値が Acme である sObject レコードを 1 件取得します。

 sObject s = [select id, name from account where name='Acme']; 

次のコードは、条件に一致するすべての sObject レコードを取得して配列に格納します。

 String myName = 'Acme'; 
 Account [] accts = [select ID from Account where name=:myName];  

上記のクエリに埋め込まれている Apex 変数の使用方法に注目してください。

SOSL ステートメントは、sObject のリストにもとづいて sObject の型ごとに検索結果を格納したリストを返します。たとえば、すべての Account レコードと Contact レコードを対象に name 項目を検索するステートメントは以下のようになります。

 List<List<SObject>> searchList= [FIND 'map*' IN NAME FIELDS RETURNING Account (id, name),Contact]; 
 Account [] accounts= (List<Account>) searchList[0];  
 Contact [] contacts= (List<Contact>) searchList[1]; 

クエリを特殊な for 構文に埋め込むこともできます。この構文は、レコード全体に対するループ処理にも使用できます。

 for (Account tmp : [select id from account where name='yyy']) {  // } 

上記のループでは、一度に 1 件のレコードを処理します。処理を効率化するには、一括処理を適用します (これにより、ガバナ制限に抵触することを回避できます)。

 for (Account[] tmp : [select id from Account where name= 'yyy']){     j = tmp.size();      // perform some actions on the accounts }  

このループのコードは 200 件の sObject につき 1 回実行されます。一括処理は配列の変数に代入されます。


Apex とトリガ

Apex でトリガを記述して、sObject に対する挿入、更新、削除などのイベントの前後に実行することができます。トリガは、次に示すように冒頭に trigger キーワードを設定して定義します。

 trigger myAccountTrigger on Account (before insert, before update) {
  if (Trigger.isInsert) {
    // do something    
  }    
  if (Trigger.isUpdate) {     
  for(Account a: Trigger.new)       
    if (a.name == 'bad')
      a.name.addError('Bad name');  // prevents  update   
  } 
 } 
 

上記のコードは、Account レコードが挿入、更新される直前に実行されます。Trigger.new は、挿入、更新対象の Account の配列へのアクセスに使用されます。更新トリガや削除トリガでは、Trigger.old を使用して、更新または削除の対象となったレコードの古いバージョンを参照できます。

トリガでは Apex を柔軟に利用できるため、ユーザは使い慣れた言語でそのままデータを操作できます。ただし若干の制限事項があり、たとえば、トリガからの Web サービスの呼び出しは、トランザクションが必要以上に増大するという理由から許可されていません。


データの操作

Apex では、DML を使用してデータベース内のデータの検索、挿入、削除、更新処理を実行できるほか、保存ポイントの作成や編集も行えます。次に例を示します。

 Acccount a = new account[] {new Account(name='foo'), new Account(name='bar')}; 
 insert a; 
 Savepoint sp = Database.setSavepoint();  
 delete a; 
 Database.rollback(sp);


データのセキュリティ

Force.com プラットフォームは、組織および組織のデータを保護するさまざまなセキュリティ機能を備えており、SAML をはじめとする各種認証方式のサポート、IP アドレスによるログオンの制限、セッションのセキュリティ、履歴追跡などによって包括的なセキュリティ基盤を実現しています。

このセクションでは、データアクセスに関連した主なセキュリティ機能を紹介します。各機能の概要とそのすぐれたメリットを理解して、ぜひ活用してください。


組織のセキュリティ

Force.com プラットフォームでは、システム管理者権限を使用して、特定のユーザのグループに対して各種機能へのアクセスを部分的に許可または禁止することができます。このようなセキュリティを実現する主要機能がプロファイルです。プロファイルを使用すると、ユーザをグループ化して容易に管理することが可能になります。なお、1 人のユーザに複数のプロファイルを割り当てることはできません。また、ユーザのプロファイルは管理者のみが変更できます。ユーザのプロファイルは、[設定]、[ユーザの管理]、[プロファイル] の順にメニューをクリックして確認できます。

プロファイルは、オブジェクトに対するユーザのアクセス権限を規定します。具体的には、ユーザに割り当てる参照、作成、編集、削除の各権限をどのように制御するかをオブジェクトごとに設定したり、オブジェクト内のどの項目に対してアクセスを許可するかを指定できます (下図参照)。

Db field level security.jpg

項目レベルでセキュリティを設定できるこの機能により、各プロファイルのメンバーがページレイアウトやレポートで利用できる項目を制御することが可能になります。プロファイルでは、ユーザにアクセスを許可するタブやアプリケーションを指定することも可能であり、これにより組織の全体的なセキュリティを実現できます。


データのセキュリティ

前のセクションで取り上げたアクセス権限は、オブジェクト内のすべてのレコードや項目のセットを対象としており、かなり大まかであると言えます。そこで、Force.com プラットフォームでは、各オブジェクトに格納されたデータレコードごとに異なるアクセス権限を実装する機能を提供しています。このような個々のデータレコードごとのセキュリティ設定によって、データのセキュリティにで数々のすぐれたオプションが利用できるようになります。

データのセキュリティにおいて基盤となるのは、レコードの所有権です。レコードの所有者は、他のユーザとのレコードの共有、レコードの所有権の移行など、そのレコードに関するあらゆる権限を保有します。レコードの所有者になることができるのは、単一のユーザまたは単一のユーザグループ (「キュー」と呼ばれるユーザの集合) です。

データのセキュリティを変更するには、組織の共有設定のデフォルト値を変更します。[設定]、[セキュリティのコントロール]、[共有設定] の順にメニューを選択し、[編集] をクリックします。このページでオブジェクトへのアクセス権限のデフォルト値を、たとえば [公開/参照・更新可能] から [非公開] などに変更します。なお、オブジェクトを [非公開] に設定した場合、各レコードの所有者のページには [共有] ボタンが表示されます。この [共有] ボタンを使用することで、任意のユーザグループに対してそのレコードに対するアクセス権限を付与できます。

以下に示すように、Force.com プラットフォームでは、手動による共有、自動共有、Apex を利用したプログラミングによる共有など、さまざまなレコード共有スキーマを用意しています。

  • 手動による共有では、[共有] ボタンを使用してレコードへのアクセスを許可できます。次の TodoItem ページをご覧ください。このオブジェクトに対する組織の共有設定のデフォルト値を [非公開] に変更したため、[共有] ボタンが表示されています。

Db sharing.jpg

[共有] ボタンをクリックすると、そのレコードへのアクセスを許可するユーザを追加したり変更したりできる画面が表示されます。

Db sharing2.jpg

  • 状況によっては、あるグループに別のグループが所有するレコードを自動的に共有させる必要が生じることがあります (なお、ここでの「グループ」とは、指定されたユーザの集まりである「公開グループ」、または「ロール」のいずれかを指します。ロールでは、特定のロールを割り当てられたユーザのほか、下位ロールのユーザも対象になることがあります)。このような共有は、共有ルールを使用することで実現できます。このルールによって、あるグループが所有するレコードへのアクセス権限を、別のグループに対して自動的に付与することが可能になります。なお、この共有ルールでは権限を拡大する設定のみが可能です。権限を制限するために使用することはできません。共有ルールにアクセスするには、[設定]、[セキュリティのコントロール]、[共有設定] の順にメニューをクリックします。次のような画面が表示されます。ここでは、任意のロールのメンバーが所有するレコードを別のロールのメンバーと共有させるルールを設定しています。

Db sharing rules.jpg

  • 最後は Apex を利用した共有です。この機能は「Apex による共有管理」と呼ばれています。ここでは Apex コードを使用して、ロジックやデータが規定するあらゆる条件下で共有を実現できます。このような共有を行う手順については、Using Apex Managed Sharing to Create Custom Record Sharing Logic (Apex による共有管理を使用したカスタムのレコード共有ロジックの作成) を参照してください。

以上のように、Force.com プラットフォームには、レコードを共有するユーザを指定するための機能が豊富に用意されています。これにより、公開グループ (企業内のブログ執筆者全員など) を設定して、このグループを対象にレコードへのアクセス権限を付与したり、企業の組織構造にもとづいたロール階層を作成し、各ロールにおいて、そのロール階層よりも下位にあるロールが持つすべての権限を行使できるように設定したりすることが可能になります。

Force.com プラットフォームでは、オブジェクトや項目レベルのセキュリティ、レコードの共有、グループやロール階層にもとづくアクセス権の割り当てまで、広範なセキュリティ機能を提供しています。

Web サービスを使用したデータアクセス

Web サービス API は、既存の Force.com のデータやロジックへの直接的なアクセスを実現する SOAP ベースの Web サービス API です。これにより、SOAP ベースの Web サービスクライアントの作成が可能なあらゆるプラットフォームとの統合が可能になります。この API を使用すると、使用しているアプリケーション (組織) のデータに直接アクセスして、クエリ、作成、削除、変更が行えます。また、sObject のメタデータに動的にアクセスすることも可能です。たとえば、特定の sObject に対してクエリを実行し、使用可能な項目やその項目の型を特定することなどができます。さらに、この API ではユーザのパスワードの変更、サーバのタイムスタンプの取得、電子メールの送信などを行うユーティリティを呼び出すことも可能です。

次に、この API を使用して新しいレコードを作成する Java コードの例を示します。

Account account = new Account(); 
account.setAccountNumber("1123581321");
account.setBillingCity("Edinburgh")
account.setName("My Account");

SObject[] sObjects = new SObject[1]; 
sObjects[0] = account;

// persist the record
SaveResult[] saveResults = binding.create(sObjects);

詳細は、Force.com Web サービス API に関するドキュメントを参照してください。


まとめ

このドキュメントでは、Force.com が提供する強力な永続層である Force.com データベースを取り上げました。Force.com データベースでは、Force.com Builder という宣言型のツールによってアプリケーションを迅速に開発することが可能です。高度な永続化機能が提供されており、データへのアクセスや操作を行うために必要なユーザインターフェースもオブジェクトのメタデータにもとづいて自動的に作成されます。また、さまざまなセキュリティ機能が用意されており、データへのアクセスを容易に制御できます。レポート作成、タグ付けなどの多彩なツールも利用でき、さらに Apex プログラミング言語との緊密な連携により、アプリケーションの高度なカスタマイズも可能になっています。


参考資料

  • Developerforce サイト: このサイトで無料の開発者用エディション Developer Edition を入手して、すぐにアプリケーション開発をスタートできます。ドキュメントやフォーラムなどへのリンクも用意されています。
  • Apexコードの概要 : Apex 言語に関する包括的なドキュメント。今回のドキュメントで取り上げられていない詳細な情報が記載されています。
  • Force.com Web サービス API : Force.com データベースに関する製品ドキュメントを網羅したリファレンスです。
  • Salesforce.com Object Query Language (SOQL)Salesforce.com Object Search Language (SOSL): Force.com Apex コード開発者向けガイド内の記事。両クエリ言語の構文と使用方法を解説しています。
  • Using Apex Managed Sharing to Create Custom Record Sharing Logic (Apex による共有管理を使用したカスタムのレコード共有ロジックの作成): Apex を使用したレコード共有処理のカスタマイズ方法について詳しく解説しています。

執筆者について

Jon Mountjoy は 米国Developerforce コミュニティの管理者および編集長として、新しいテクノロジを意欲的に探求し、コミュニティにフィードバックしています。Jon は 米国Developerforce でブログを執筆しているほか、Twitter、FriendFeed などにも参加しています。以下に Jon 本人からのメッセージをお伝えします。「この場を借りて、このドキュメントのために著書の引用を許可してくれた Rick Greenwald 氏、素晴らしいコンテンツを作成してくれた Force.com プラットフォームドキュメンテーションチームに対し、感謝の意を表します。Rick 氏には、貴重な助言ならびに誤りの指摘もいただきました。同様の貢献をしてくださった Mike Kreaden 氏、Michael Russo 氏とともに、3 氏に厚くお礼申し上げます。このドキュメントに関する皆様からのご意見をお待ちしています」