Heroku Connect のデータベーステーブル
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年03月30日(木)
Table of Contents
データベーステーブルの構造
オブジェクトをマッピングすると、Heroku Connect は、そのマッピングされたオブジェクトのデータを保存するために使用されるデータベーステーブルを作成または更新します。
マッピングテーブルでは、Salesforce オブジェクト名の小文字のバージョンが使用されます。たとえば、
Account
Salesforce オブジェクトはaccount
データベーステーブルにマッピングされます。列名では、Salesforce フィールド名の小文字のバージョンが使用されます。たとえば、
AccountNumber
Salesforce フィールドはaccountnumber
データベース列にマッピングされます。新しいマッピングを作成すると、Heroku Connect が Salesforce からのデータを自動的に入力するための新しいデータベーステーブルが作成されます。
既存のマッピングを編集すると、
ALTER TABLE
SQL コマンドを使用して既存のデータベーステーブルが変更されます。Heroku Connect は、新しくマッピングされたすべてのフィールドに Salesforce からのデータを入力します。
Heroku Connect では、新しいマッピングの作成時に既存のテーブルを置き換えません。テーブルが正しく作成されない場合、データの同期時にエラーが発生します。マッピングされたテーブルを自分で作成することは避けてください。ORM フレームワークを使用する場合は、そのフレームワークで、基礎となるテーブルをデータベースに作成しようとしていないことを確認してください。
システム列
データベース列にマッピングするように選択された Salesforce フィールドに加えて、Heroku Connect は、マッピングされたテーブルに次のシステム列を自動的に追加します。
列名 | データベース型 | インデックス処理 | 説明 |
---|---|---|---|
id |
整数 | あり (プライマリキー) | 一意の、自動的に増分する整数のプライマリキー。これは、実装の詳細とみなす必要があります。Heroku Connect は、このシーケンスがリセットされるタイミングや、リロード後の値の一意性について保証していません。 |
sfid |
varchar(18) | あり (一意) | レコードが Salesforce と同期されたときにデータが自動的に入力される Salesforce オブジェクトの Id フィールド。 |
systemmodstamp |
タイムスタンプ | あり | Salesforce オブジェクトが最後に変更された日時 (UTC タイムゾーン) であり、更新のポーリング時に Heroku Connect によって使用されます。 |
isdeleted |
ブール値 | なし | Salesforce の IsDeleted フィールドを追跡するために使用されます。これにより、Heroku Connect は、更新のポーリング時に Salesforce で削除されたレコードを処理できます。Salesforce オブジェクトに IsDeleted フィールドがある場合にのみ作成されます。 |
_hc_lastop |
varchar(32) | なし | レコードに対して実行された最後の同期操作を示します。 |
_hc_err |
varchar(1024) | なし | 最後の同期操作でエラーが発生した場合は、そのエラーに関するより詳細な情報が含まれた JSON オブジェクトがこの列に含まれます。 |
これらの列は、同期操作を追跡して報告するために Heroku Connect によって使用されるため、テーブルから削除してはなりません。デバッグを支援するために列から読み取ることはできますが、Heroku Connect の同期操作でエラーが発生する可能性があるため、これらの列に書き込んではなりません。
システムフィールド: 読み取り専用の列
Heroku Connect で書き込みを Salesforce に同期するときに、読み取り専用である一部の列への書き込みは無視されます。これらの列は、ほとんどの Salesforce オブジェクトにあるシステムフィールドに対応しています。詳細は、システムフィールドに関するページを参照してください。
新しいレコードの書き込みを Salesforce に同期するときに、次の列は設定できません。
CreatedDate
Id
IsDeleted
LastModifiedDate
SystemModstamp
更新を Salesforce に同期するときに、次の列は更新できません。
CreatedById
CreatedDate
IsDeleted
LastModifiedById
LastModifiedDate
SystemModstamp
ステータス情報
_hc_lastop
および _hc_err
列を使用すると、デバッグを支援したり、アプリケーションで同期ステータス情報を表示したりできます。
_hc_lastop
列は、最初は空白になり、その後に同期プロセスの一部として次のいずれかのステータスに更新されます。
'PENDING'
- データベース内の新しい行が Salesforce との同期を待っています。'INSERTED'
- データベース内の新しい行が Salesforce に挿入されました。この時点で、sfid
も設定されます。'UPDATED'
- データベース内の既存の行が Salesforce で正常に更新されました。'SYNCED'
- 新しい行が Salesforce から同期されました。'FAILED'
- Salesforce の同期が失敗しました。NULL
- この行は初期ロードから変更されていません。
簡単には修正できない以前からあるバグが原因で、_hc_lastop
は実際の状態を表していることが保証されません。_hc_lastop
を使用して Salesforce への書き込みの成功を判定している場合は、常にそれをトリガーログと照合します。
失敗が発生した場合は、次のプロパティが含まれた JSON オブジェクトが _hc_err
列に含まれます。
プロパティ | 説明 |
---|---|
op |
試行された Salesforce 操作。 |
src |
エラーのソース。Salesforce エラーの場合は、SFDC に設定されます。 |
msg |
エラーを説明している Salesforce によって返されたメッセージ。 |
マッピングされるデータ型
次の表は、Salesforce フィールド型がデータベース内の列にどのようにマッピングされるかを示しています。
ほとんどの Salesforce フィールド型は Heroku Connect で完全にサポートされています。現時点でサポートされていないフィールド型についての詳細は、以下を参照してください。
Salesforce の型 | データベース型 | 注意事項 |
---|---|---|
AnyType | テキスト | 値は、データベースに保存されるときに、その動的な型 (テキスト、日付、数値など) からテキストに変換されます。 |
Auto Number | varchar | フィールドの長さは、フィールド設定に基づいて Salesforce によって提供されます。 |
Checkbox | ブール値 | |
Currency | 倍精度 | |
Date | 日付 | |
DateTime | タイムゾーンなしのタイムスタンプ | 時刻は UTC として保存されます。 |
varchar(80) | ||
Encrypted String | varchar | フィールドの長さは、フィールド設定に基づいて Salesforce によって提供されます。これらのフィールドの処理方法についての詳細は、以下を参照してください。 |
External Lookup Relationship | varchar | フィールドの長さは、フィールド設定に基づいて Salesforce によって提供されます。 |
Formula | 使用されるデータベース型は、数式の戻り値の型 (たとえば、Checkbox の戻り値の型はブール値のデータベース型を使用する) によって決定されます。これらのフィールドの処理方法についての詳細は、以下を参照してください。 | |
ID | varchar(18) | 自動的に sfid としてマッピングされます (「システム列)」を参照)。 |
Lookup Relationship | varchar(18) | |
Number | 倍精度 | |
Percent | 倍精度 | パーセント記号が削除されたかのように、パーセント値が提供されます。たとえば、100% は Postgres では 100 として保存されます。計算で使用するために、この数値を 100 で割ることができます。 |
Phone | varchar(40) | (650) 555-0100 などの形式が含まれています。 |
Picklist | varchar | フィールドの長さは、ピックリスト項目に基づいて Salesforce によって提供されます。2020 年 8 月 13 日よりも後に作成されたアドオンでは、これは varchar(255) であることが保証されます。 |
Picklist (Multi-Select) | varchar(4099) | 複数の選択がセミコロン区切りリストとして返されます。 例: item 1;item 2 |
Reference | varchar(18) | |
Roll-Up Summary | 倍精度 | これらのフィールドの処理方法についての詳細は、以下を参照してください。 |
Text | varchar | フィールドの長さは、フィールド設定に基づいて Salesforce によって提供されます。 |
Text Area | テキストまたは varchar | フィールドの長さが 256 以上の場合はテキスト、それ以外の場合は varchar。 |
Text Area (Long) | テキストまたは varchar | フィールドの長さが 256 以上の場合はテキスト、それ以外の場合は varchar。 |
Text Area (Rich) | テキストまたは varchar | フィールドの長さが 256 以上の場合はテキスト、それ以外の場合は varchar。 |
Time | タイムゾーンなしの時刻 | |
URL | varchar | フィールドの長さは、フィールド設定に基づいて Salesforce によって提供されます。 |
空の文字列/空白文字列/NULL 文字列
Salesforce のデータモデルには、空の文字列の概念はありません。このため、空の文字列または空白文字列の値を示すには、すべての文字列型が DB で NULL の値を使用する必要があります。 Connect によって管理されているテーブルに空の文字列が書き込まれた場合、その値は NULL に自動的に変換されます。
暗号化された文字列
Heroku Connect での暗号化された文字列の処理方法は、Salesforce 組織が Shield Platform Encryption または従来の暗号化のどちらを使用しているかによって異なります。
Shield Platform Encryption
Shield Platform Encryption が有効になっているフィールドまたはレコードは、Salesforce で保存時に暗号化されます。Salesforce で Heroku Connect を認証するために使用されるユーザー資格情報に暗号化されたフィールドまたはレコードに対する読み取りアクセス権がある場合、暗号化されていない値は Salesforce から受信され、暗号化されずにデータベースに保存されます。ユーザーに読み取りアクセス権がない場合、そのユーザーはデータを表示できません。"暗号化されたデータの表示" アクセス許可は Shield Platform Encryption には適用されません。
従来の暗号化
Salesforce で Heroku Connect を認証するために使用されるユーザー資格情報に暗号化されたデータの表示アクセス許可がない場合、暗号化された文字列はマスクされた形式で Salesforce から受信されます。
たとえば、暗号化されたクレジットカード番号は ****-****-****-1023
としてデータベースに保存されます。
データベースが新しいプレーンテキスト値で更新される可能性があり、Salesforce は、その新しいデータがデータベースからプッシュされたときに暗号化を処理します。そのレコードが次回 Salesforce からのデータで更新されると、データベース内のプレーンテキスト値はマスクされた形式で上書きされます。
従来の暗号化を使用しているときに暗号化されていない値を Salesforce から受信できるようにするには、Heroku Connect を認証するために使用されるユーザー資格情報の暗号化されたデータの表示アクセス許可を有効にする必要があります。
クロスオブジェクト数式およびロールアップサマリーフィールド
数式フィールドは、クエリ時に Salesforce によって計算され、他のフィールド、関数、リテラル値を使用できます。また、マスターの詳細またはルックアップ関係を使用して、親オブジェクト内のフィールドを参照することもできます。ただし、これにより、Heroku Connect がデータを同期しているときに問題が発生する場合があります。
数式フィールドは自動的に計算され、レコード詳細ページで読み取り専用になっており、最終更新日フィールドを更新しません。親オブジェクトが変更されたことにより発生した数式フィールドの変更によって、子オブジェクトの SystemModStamp
は更新されません。つまり、このオブジェクトは Heroku Connect によって同期されません。
次に例を示します。
Contact
オブジェクトには、関連する親Account
オブジェクトのName
フィールドを参照するname_formula__c
という名前の数式フィールドがあります。Account
レコードのName
フィールドが更新されます。name_formula__c
の更新された値は、関連Contact
レコードのクエリが実行されたときに返されます。Contact
レコードのSystemModStamp
は更新されないため、新しいname_formula__c
値は Heroku Postgres データベースと同期されません。
この問題の考えられる回避方法の説明については、Salesforce Idea Exchange を参照してください。
ロールアップサマリーフィールドには親レコードの関連子レコードからの値が要約され、マスターの詳細関係の親レコードの値が表示されます。Salesforce では、ロールアップサマリーフィールドで参照されている子オブジェクトのフィールドが更新されると、ロールアップサマリーフィールドが計算されます。
次に例を示します。
- 親
Account
オブジェクトに、関連の子Opportunity
レコードのAmount
フィールドの合計を計算するamount_rollup__c
というロールアップサマリーフィールドがあります。 Opportunity
レコードのAmount
フィールドが更新されます。- 関連
Opportunity
レコードのAmount
フィールドが更新されると、Account
レコードのamount_rollup__c
の値が更新されます。 Account
オブジェクトのSystemModStamp
は最後に更新されるため、新しいamount_rollup__c
値は最後に Heroku Postgres データベースと同期されます。
ロールアップサマリーフィールド値の計算には、影響を受けるレコード数とその他の要因に応じて、最大 30 分かかる可能性があります。計算済みフィールドが同期していない理由についてのこの Heroku ヘルプ記事を参照してください。
サポートされていないデータ型
次の型はサポートされていないため、マッピングを作成または編集するときに Mapped Fields (マッピングされたフィールド) 一覧に表示されません。
Base64 バイナリフィールド
Attachment
、ContentVersion
、Document
、Scontrol
などに保存されたバイナリファイルは、Base64 でエンコードされたバイナリデータ型を使用します。Base64 フィールドは Bulk API クエリでサポートされていないため、Heroku Connect ではサポートされません。したがって、画像やその他の種類のバイナリデータはサポートされません。代わりの方法として、Amazon S3 に画像を保存し、画像の URI を含む単純なテキストフィールドを Salesforce とデータベースの間で同期することができます。
複合フィールド
Address および Geolocation 複合フィールド型は直接マッピングできませんが、そのコンポーネントのフィールドをマッピングに追加することは可能です。
たとえば、Contact
オブジェクトには、次のフィールドを使用してマッピングできる MailingAddress
Address フィールドがあります。
フィールド名 | データベース型 |
---|---|
MailingCity | varchar(40) |
MailingCountry | varchar(80) |
MailingLatitude | 倍精度 |
MailingLongitude | 倍精度 |
MailingPostalCode | varchar(20) |
MailingState | varchar(80) |
MailingStreet | varchar(255) |
同様に、OfficeLocation
という名前のカスタム Geolocation フィールドは、次のフィールドを使用してマッピングされます。
フィールド名 | データベース型 |
---|---|
OfficeLocation__Latitude__s | 倍精度 |
OfficeLocation__Longitude__s | 倍精度 |
サポートされていないオブジェクト型
次のオブジェクト型は、現在サポートされていません。
Big Objects
この型のオブジェクトの API 名には __b
のサフィックスが付いています。Salesforce には、Heroku Connect が Big Objects を同期できない SOQL クエリの制限があります。
Platform Events
この型のオブジェクトの API 名には __e
のサフィックスが付いています。
External Objects
この型のオブジェクトの API 名には __x
のサフィックスが付いています。
マッピングされたテーブルのクエリ
マッピングされたテーブルは、Postgres データベース内の他のテーブルと同様にクエリできます。アドオンをプロビジョニングするときに選択したスキーマ名で (たとえば、デフォルトの salesforce
スキーマ名を使用して) テーブル名を修飾する必要があります。
SELECT * FROM salesforce.account;
完全修飾名を指定しなくてもテーブルをクエリできるように、そのスキーマを Postgres のスキーマ検索パスに追加することもできます。次に例を示します。
SET search_path TO salesforce,public;
SELECT * FROM account;
検索パスを設定する場合は、public
スキーマを含める必要があります。これには、Heroku Connect によって使用される共有関数が含まれています。
システムテーブル
Heroku Connect は、スキーマ内に次のいくつかのシステムテーブルを作成します。
_hcmeta
This table contains metadata that allows Connect to ensure the database is properly initialized and configured.
_trigger_log
The
_trigger_log
table is used to record updates that must be written to Salesforce. Data remains in this table for up to one day allowing you to track updates that are pending, in progress or have already completed. If an error occurs while writing to Salesforce it’s logged in this table._trigger_log_archive
_trigger_log
テーブル内のデータが 1 日を過ぎると、データは最大 31 日間利用できるこのアーカイブテーブルに移されます。注意: アーカイブはデモプランでは 7 日間のみ利用できます。
これらのテーブルは、同期操作を追跡するために Heroku Connect によって使用されるため、スキーマから削除してはなりません。デバッグを支援するためにテーブルから読み取ることはできますが、Heroku Connect の同期操作でエラーが発生する可能性があるため、これらのテーブルに書き込んではなりません。
Connect スキーマには、Salesforce と同期するテーブルのみを格納してください。他のテーブルを追加すると、_trigger_log
が汚染され、捕捉された変更を処理および無視しようとする間、Connect の速度が低下します。複数のスキーマをまたいでテーブルにアクセスする必要がある場合は、PostgreSQL の search_path
機能をアプリケーションで検討してください。
Salesforce のスキーマの変更
フィールドの追加
Salesforce 内のオブジェクトに新しいフィールドを追加しても、Heroku Connect の同期操作には影響を与えません。既存のマッピングに新しいフィールドを追加することを選択した場合、Heroku Connect はマッピングされたデータベーステーブル内に自動的に列を作成し、Salesforce からフィールドのデータを取得し、そのデータを使用してデータベース内の既存のレコードを設定します。
- 単一列をマッピングに追加する場合、そのフィールドの値が NULL であるレコードを除いて、そのオブジェクトのデータが Heroku Connect によって Salesforce から取得されます。
- 複数列を追加する場合、Salesforce からデータを取得するクエリで NULL 値は除外されません。
フィールドの変更
Heroku Connect は、Salesforce 内のフィールドの定義の変更 (フィールドのデータ型や長さの変更など) をただちには検出しないため、これにより同期エラーが発生する可能性があります。
フィールド定義を変更する必要がある場合は、次のようにする必要があります。
- マッピングを編集し、変更しようとしているフィールドを削除します。
- Salesforce でフィールド定義を変更します。
- マッピングを編集し、手順 1 で削除したフィールドを戻します。これにより、そのフィールドのデータ型に手順 2 で行った変更が反映されます。
フィールドの削除
Salesforce オブジェクトからフィールドを削除する場合は、まず Heroku Connect でそのフィールドをマッピングから削除することがベストプラクティスです。フィールドをマッピングから削除する前に Salesforce オブジェクトから削除することを選択した場合、Heroku Connect は次回、変更がないかどうかマッピングがポーリングされたときにエラーを報告します。このエラーを解決するには、マッピングを編集し、なくなっているフィールドを削除します。これらは赤色で強調表示されます。変更を保存すると、Heroku Connect はマッピングされたテーブルから列を削除し、それにより同期操作が再開されます。