salesforceでデータの変更履歴を追跡する方法と注意点

Salesforceでは、標準オブジェクトとカスタムオブジェクトのレコードに変更を加えたときに、その前後でデータがどのように変わったかを保持することが出来ます。

ClassicでもLightningExperienceでも、設定するだけで簡単に追跡ができます。

特にプロファイルなどは、最新の情報しか保持していなかったりしますが、「いつ変わったのかなー」と確認したり、重要な項目で、その変更履歴を管理しなければならないときに使うことが多いです。

標準オブジェクトでの設定方法

「設定」⇒「オブジェクトマネージャ」で標準オブジェクトを開き、「項目とリレーション」を開きます。

すると上記のような画面になりますが、その右上の方に「項目履歴管理の設定」というボタンがあります。

これを押すと、初めてそのオブジェクトに対して設定を行う際には、以下のような画面が表示されます。↓ ↓ ↓ ↓
ここでチェックを入れて有効化しましょう。

すると、以下のように、オブジェクトの項目が表示されますので、追跡したい項目にチェックを入れます。↓ ↓ ↓ ↓
これで、変更履歴が追跡されるようになります。

カスタムオブジェクトでの設定方法

カスタムオブジェクトでも同様に追跡が設定できます。

注意

カスタムオブジェクトの場合は、オブジェクトマネージャの詳細のところで、「項目履歴管理」という項目にチェックを入れないと、変更履歴の追跡は開始されませんし、レイアウトに表示することも出来ません

はじめに「項目履歴管理」にチェックを入れましょう。↓ ↓ ↓ ↓

その後、標準オブジェクトと同様に、「設定」⇒「オブジェクトマネージャ」⇒「項目とリレーション」から「項目履歴管理の設定」ボタンを押します。↓ ↓ ↓ ↓

すると、以下のようにトラッキング(追跡)できる項目を選択できます。↓ ↓ ↓ ↓
チェックを入れて保存すると、レコードを変更するたびに、変更履歴が保存されるようになります。

変更履歴の制限事項

SalesforceのHelpを確認すると、変更履歴には以下のような制限がありますので、使用時には注意しましょう。

  • 追跡できる項目数・・・オブジェクトごとに、標準項目とカスタム項目を最大 20 項目まで選択できます。
  • データの保持期間・・・項目履歴データは、組織経由で最大 18 か月間、API 経由で最大 24 か月間保持されます。
  • データの項目・・・255 文字を超える項目に対する変更は、編集済みとして追跡され、元の値と新しい値は記録されません。
  • 追跡できるデータの種類の制限・・・次のものは追跡できません。数式項目、積み上げ集計項目、または自動採番項目、[作成者] および [最終更新者]

変更履歴を表示して確認できるようにするには?

変更履歴はそのままだと表示されません。

表示して確認できるようにするには、以下の設定を行います。

①そのオブジェクトのレイアウトを編集する

②「関連リスト」として履歴が選択できるようになっているので、それを関連リストに表示させる↓ ↓ ↓ ↓

これで、そのオブジェクトの履歴が関連リストとして表示され、確認できるようになります。

履歴オブジェクトの構造について

そもそも、変更履歴のレコードは、そのオブジェクトの子オブジェクトとして作成されます。

標準オブジェクトの場合、取引先だと「AccountHistroy」、取引先責任者だと「ContactHistory」といった具合に、あらかじめ「標準オブジェクト名+History」というオブジェクトがあるので、ここに変更履歴が追加されていきます。

これがカスタムオブジェクトだと、「SampleObject1__history」のように、「カスタムオブジェクト名+History」のような命名規則でオブジェクトができ、そこに変更履歴が追加されていきます。

そのため、履歴オブジェクトをSOQLで検索するには、

//標準オブジェクトの場合
SELECT OldValue, NewValue FROM ContactHistory

//カスタムオブジェクトの場合
SELECT OldValue, NewValue, Parent.Id, Parent.name FROM SampleObject1__history

のように引っ張れます。

また、Historiesという名前で親オブジェクトから参照できるので、

//標準オブジェクトの場合
SELECT Name, Id, (SELECT OldValue, NewValue FROM Histories) FROM Contact

//カスタムオブジェクトの場合
SELECT Name, Id, (SELECT OldValue, NewValue FROM Histories) FROM SampleObject1__c

のようにすると、変更履歴を管理しているオブジェクトとその履歴を一緒に取得することが可能です。