9.12. Salesforce 翻訳者
Salesforce のトランスレーターを使用して Salesforce.com アカウントに対して SELECT
、DELETE
、INSERT
、UPSERT、
および UPDATE
操作を実行します。
salesforce
タイプ name salesforce によって認識されるトランスレーターは Salesforce API 37.0 以降と連携します。
名前 | 説明 | デフォルト |
---|---|---|
MaxBulkInsertBatchSize | 一括挿入の挿入に使用するバッチサイズ。 | 2048 |
SupportsGroupBy |
| true |
Salesforce トランスレーターはメタデータをインポートできます。
プロパティー名 | 説明 | 必須 | デフォルト |
---|---|---|---|
NormalizeNames | インポーターが引用解除を使用できるようにオブジェクト/フィールド名の変更を試みる場合。 | false | true |
excludeTables | テーブル名に一致する大文字と小文字を区別しない正規表現は、インポートから除外します。テーブル名の取得後に適用されます。負の先読み(?!<inclusion pattern>)を使用して、包含フィルターとして機能します。 | false | 該当なし |
includeTables | テーブル名に対して一致する大文字と小文字を区別しない正規表現は、インポート時に含まれます。テーブル名がソースから取得された後に適用されます。 | false | 該当なし |
importStatstics | REST API explain plan 機能を使用して、インポート中にカードを取得します。 | false | false |
ModelAuditFields | Audit フィールドをモデルに追加します。これには、CreatedXXX、LastModifiedXXX、および SystemModstamp フィールドが含まれます。 | false | false |
注記: インポート中に includeTables パターンと excludeTables パターンの両方が存在する場合、includeTables パターンが最初に一致すると、excludePatterns が適用されます。
構築したもの以外の API バージョンへの接続が必要な場合は、既存の接続ペアの使用を試みることがありますが、場合によっては(とくに古い Java API から後のリモート api にアクセスする場合など)、これは不可能であり、接続がハングする内容が発生します。
エクステンションメタデータプロパティー
Salesforce はリレーショナルデータベースではありませんが、Data Virtualization は Saleforce データをテーブルや手順などのリレーショナルデータベースにマッピングする方法を提供します。Salesforce の SObject にマップする Data Virtualization VDB の DDL を使用して外部テーブルを定義できます。ランタイム時に、このテーブルを SObject に解釈するには、Data Virtualization は追加のメタデータでこのテーブル定義を分離またはタグ付けします。たとえば、テーブルは以下の例のように定義されます。
上記の例では、プロパティー "teiid_sf:Supports Query"
が TRUE
に設定されている OPTIONS
句のプロパティーは、このテーブルに対して SELECT
コマンドを実行できることを示しています。以下の表は、Salesforce スキーマで使用できるメタデータエクステンションプロパティーを示しています。
プロパティー名 | 説明 | 必須 | デフォルト | 適用先 |
---|---|---|---|---|
Query のサポート |
テーブルに対して | false | true | テーブル |
Retrieve をサポートします。 |
テーブルに対して実行される | false | true | テーブル |
SQL の処理
Salesforce はリレーショナルデータベースと同じ機能セットを提供しません。たとえば、Salesforce はテーブル間の任意の参加をサポートしません。ただし、Data Virtualization Query Planner と組み合わせて、Salesforce コネクターは Data Virtualization のほとんどの SQL 構文機能を使用できます。Salesforce Connector は、使用可能な機能に応じて、可能な限りコマンドを Salesforce に「プッシュ」して SQL コマンドを実行します。Salesforce Connector が指定の SQL コンストラクトを明示的に使用できないと、Data Virtualization は自動的に追加のデータベース機能を提供します。特定の SQL 機能を Salesforce にプッシュできない場合、Data Virtualization は実行できる機能をプッシュし、Salesforce から一連のデータを取得します。その後、Data Virtualization は追加機能を評価し、元のデータセットのサブセットを作成します。最後に、Data Virtualization は結果をクライアントに渡します。
GROUP BY
句でクエリーを発行し、queryMore
がサポートされていないことを示す Salesforce エラーを受信し、制限を追加するか、または実行プロパティー SupportsGroupBy
を false
に設定できます。
SELECT array_agg(Reports) FROM Supervisor where Division = 'customer support';
SELECT array_agg(Reports) FROM Supervisor where Division = 'customer support';
Salesforce や Salesforce Connector は、array_agg()
スカラーをサポートしていません。ただし、どちらも CompareCriteriaEquals
クエリーと互換性があるため、コネクターはこのクエリーを受信するクエリーを Salesforce に変換します。
SELECT Reports FROM Supervisor where Division = 'customer support';
SELECT Reports FROM Supervisor where Division = 'customer support';
array_agg()関数は、Data Virtualization Query Engine によってコネクターによって返される結果セットに適用されます。
コネクターに渡される SQL を処理するため、Salesforce アプリケーションへの複数の呼び出しが行われることがあります。
DELETE From Case WHERE Status = 'Closed';
DELETE From Case WHERE Status = 'Closed';
Salesforce の API からオブジェクトの削除は、オブジェクト ID でのみ削除できます。そのために、Salesforce コネクターは最初にクエリーを実行して正しいオブジェクトの ID を取得し、次にこれらのオブジェクトを削除します。そのため、上記の DELETE コマンドは以下のコマンド 2 つになります。
SELECT ID From Case WHERE Status = 'Closed'; DELETE From Case where ID IN (<result of query>);
SELECT ID From Case WHERE Status = 'Closed';
DELETE From Case where ID IN (<result of query>);
注記: Salesforce API DELETE 呼び出しは SQL で表現されていませんが、上記は同等の SQL 式です。
Salesforce から大規模なデータセットを取得し、可能な限りクエリーを行うのを避けるために、互換性のない機能を認識しておくと便利です。Salesforce にプッシュできる SQL コンストラクトに関する詳細は、互換性のある SQL 機能 を参照してください。
複数選択の選択リストからの選択
マルチ選択リストとは、1 つのフィールドに複数の値を含むことができる Salesforce のフィールドタイプです。SOQL のこのタイプのフィールドのクエリー基準演算子は、EQ、NE、include および exclude に制限されます。複数選択 の選択リストから選択する Salesforce ドキュメントは、「Multi-select Picklistsのクエリー」を参照してください。
Data Virtualization SQL は includes 演算子または excludes 演算子をサポートしませんが、Salesforce コネクターはこれらの Operator のユーザー定義関数定義を提供し、タイプがマルチ選択のフィールドに同等の機能を提供します。関数の定義は以下のとおりです。
boolean includes(Column column, String param) boolean excludes(Column column, String param)
boolean includes(Column column, String param)
boolean excludes(Column column, String param)
たとえば、これらの値すべてが含まれる Status という名前のマルチ選択のコラムを 1 つ取ります。
- current
- working
- critical
この列については、以下のすべてが有効なクエリーになります。
SELECT * FROM Issue WHERE true = includes (Status, 'current, working' ); SELECT * FROM Issue WHERE true = excludes (Status, 'current, working' ); SELECT * FROM Issue WHERE true = includes (Status, 'current;working, critical' );
SELECT * FROM Issue WHERE true = includes (Status, 'current, working' );
SELECT * FROM Issue WHERE true = excludes (Status, 'current, working' );
SELECT * FROM Issue WHERE true = includes (Status, 'current;working, critical' );
EQ および NE の基準は、指定されるとおり Salesforce に渡されます。たとえば、これらのクエリーはコネクターによって変更されません。
SELECT * FROM Issue WHERE Status = 'current'; SELECT * FROM Issue WHERE Status = 'current;critical'; SELECT * FROM Issue WHERE Status != 'current;working';
SELECT * FROM Issue WHERE Status = 'current';
SELECT * FROM Issue WHERE Status = 'current;critical';
SELECT * FROM Issue WHERE Status != 'current;working';
すべてのオブジェクトの選択
Salesforce コネクターを使用して、Salesforce API から queryAll
操作を呼び出すことができます。queryAll
操作は、システム内の現在および削除された全オブジェクトに関するデータを返す例外によるクエリー操作と同等です。
コネクターは、各 Salesforce オブジェクトにある isDeleted
プロパティーへの参照を介して query または queryAll
操作を呼び出すかどうかを決定します。また、インポーターによって生成された各テーブルの列としてモデル化されます。デフォルトでは、モデルが生成され、コネクターがクエリーを呼び出すと、この値は false
に設定されます。ユーザーはモデルの値を true
に自由に変更し、コネクターのデフォルト動作を queryAll
に変更します。
isDeleted
がクエリーのパラメーターとして使用されている場合の動作は異なります。isDeleted
列がクエリーのパラメーターとして使用され、値が true
の場合、コネクターは queryAll
を呼び出します。
select * from Contact where isDeleted = true;
select * from Contact where isDeleted = true;
isDeleted
列がクエリーのパラメーターとして使用され、値が false
の場合、デフォルトの動作を実行するコネクターがクエリーを呼び出します。
select * from Contact where isDeleted = false;
select * from Contact where isDeleted = false;
更新されたオブジェクトの選択
Salesforce からメタデータをインポートする際にオプションが選択されている場合は、以下の構造でモデルに GetUpdated 手順が生成されます。
使用方法は、Salesforce ドキュメントの GetUpdated 操作の説明を参照してください。
削除されたオブジェクトの選択
Salesforce からメタデータをインポートする際にオプションが選択されている場合は、以下の構造でモデルに GetDeleted 手順が生成されます。
使用方法は、Salesforce ドキュメントの GetDeleted 操作の説明を参照してください。
関係クエリー
リレーショナルデータベースとは異なり、Salesforce は結合操作をサポートしませんが、オブジェクト間の子または子間の関係を含むクエリーをサポートします。これらは、概念的なクエリーです。Outer Join 構文を使用すると、SalesForce コネクターで以下のクエリーを実行できます。
SELECT Account.name, Contact.Name from Contact LEFT OUTER JOIN Account on Contact.Accountid = Account.id
SELECT Account.name, Contact.Name from Contact LEFT OUTER JOIN Account
on Contact.Accountid = Account.id
このクエリーは、子から親への関係クエリーを生成するために SalesForce モデルをクエリーするための正しい構文を示しています。SalesForce に対して以下のクエリーを解決します。
SELECT Contact.Account.Name, Contact.Name FROM Contact
SELECT Contact.Account.Name, Contact.Name FROM Contact
select Contact.Name, Account.Name from Account Left outer Join Contact on Contact.Accountid = Account.id
select Contact.Name, Account.Name from Account Left outer Join Contact
on Contact.Accountid = Account.id
このクエリーは、親から子への関係クエリーを生成するために SalesForce モデルをクエリーするための正しい構文を示しています。SalesForce に対して以下のクエリーを解決します。
SELECT Account.Name, (SELECT Contact.Name FROM Account.Contacts) FROM Account
SELECT Account.Name, (SELECT Contact.Name FROM
Account.Contacts) FROM Account
制限については、SalesForce ドキュメントの「 Queries 」操作の説明を参照してください。
クエリーの一括挿入
また、JDBC バッチセマンティクスまたは SELECT INTO セマンティクスを使用して、SalesForce トランスレーターで一括挿入ステートメントを使用することもできます。バッチサイズは実行プロパティー MaxBulkInsertBatchSize で決定され、vdb ファイルで上書きできます。バッチのデフォルト値は 2048 です。一括挿入機能は、Salesforce が公開する非同期 REST ベースの API を使用して、パフォーマンスを強化します。
一括選択
10,000,000 を超えるレコードを持つテーブルをクエリーする場合、または結果のバッチ処理でタイムアウトが発生した場合、Data Virtualization は一括 API を使用して Salesforce へのクエリーを発行できます。一括選択を使用する場合は、クエリーと互換性のあるプライマリーキー(PK)のチャンクが有効になります。
一括 API を使用するには、クエリーに source ヒントが必要です。
SELECT /*+ sh salesforce:'bulk' */ Name ... FROM Account
SELECT /*+ sh salesforce:'bulk' */ Name ... FROM Account
salesforce はターゲットソースのソース名に置き換えます。
デフォルトのチャンクサイズ 100,000 レコードが使用されます。
この機能は Salesforce API バージョン 28 以降でのみサポートされます。
互換性のある SQL 機能
以下の SQL 機能を Salesforce コネクターで使用します。これらの SQL コンストラクトは Salesforce にプッシュされます。
- SELECT コマンド
- INSERT コマンド
- UPDATE コマンド
- DELETE コマンド
- NotCriteria
- OrCriteria
- CompareCriteriaEquals
- CompareCriteriaOrdered
- IsNullCritiera
- InCriteria
- LikeCriteria: String フィールドのみに使用できます。
- RowLimit
- 基本的な集約値
- 結合基準 KEY で参加
ネイティブクエリー
Salesforce の手順には、任意でネイティブクエリーが関連付けられる場合があります。詳細は「 Translators でパラメーター化 可能なネイティブクエリー 」を参照してください。操作接頭辞(select;、insert、update、delete、delete)は native-query に存在する必要がありますが、ソースへのクエリーの一部として発行されません。
Salesforce ネイティブ手順の DDL の例
CREATE FOREIGN PROCEDURE proc (arg1 integer, arg2 string) OPTIONS ("teiid_rel:native-query" 'search;SELECT ... complex SOQL ... WHERE col1 = $1 and col2 = $2') returns (col1 string, col2 string, col3 timestamp);
CREATE FOREIGN PROCEDURE proc (arg1 integer, arg2 string) OPTIONS ("teiid_rel:native-query" 'search;SELECT ... complex SOQL ... WHERE col1 = $1 and col2 = $2')
returns (col1 string, col2 string, col3 timestamp);
直接クエリーの手順
セキュリティーリスクにより、ソースに対してコマンドを実行できるセキュリティーリスクがあるため、この機能はデフォルトではオフになっています。直接クエリー手順を有効にするには、SupportsDirectQueryProcedure
と呼ばれる実行プロパティーを true
に設定します。詳細は、9章翻訳者 の「 実行プロパティーの上書き」を 参照してください。
デフォルトでは、クエリーを直接実行する手順の名前は native と呼ばれます。デフォルト名を変更する方法は、9章翻訳者 の「 実行プロパティーの上書き」を 参照してください。
Salesforce Translator は、Data Virtualization の解析または解決を行わずに、アドホック SOQL クエリーをソースに対して直接実行する手順を提供します。この手順の結果のメタデータは Data Virtualization には認識されないため、オブジェクト配列として返されます。ARRAYTABLE は、クライアントアプリケーションが使用するための表形式出力です。Data Virtualization は、以下の手順で以下のように単純なクエリー構造で公開します。
example の選択
SELECT x.* FROM (call sf_source.native('search;SELECT Account.Id, Account.Type, Account.Name FROM Account')) w, ARRAYTABLE(w.tuple COLUMNS "id" string , "type" string, "name" String) AS x
SELECT x.* FROM (call sf_source.native('search;SELECT Account.Id, Account.Type, Account.Name FROM Account')) w,
ARRAYTABLE(w.tuple COLUMNS "id" string , "type" string, "name" String) AS x
上記のコードから、「search」キーワードの後にクエリーステートメントが続きます。
SOQL は、パラメーター値をクエリー文字列に適切に挿入できるように、パラメーター化されたネイティブクエリーとして扱われます。詳細は「 Translators でパラメーター化 可能なネイティブクエリー 」を参照してください。検索によって返される結果には、選択されたかどうかにかかわらず、最初の列の値としてオブジェクト ID が含まれる場合があります。また、複数のオブジェクトタイプから列を選択するクエリーは適切ではありません。
例の削除
SELECT x.* FROM (call sf_source.native('delete;', 'id1', 'id2')) w, ARRAYTABLE(w.tuple COLUMNS "updatecount" integer) AS x
SELECT x.* FROM (call sf_source.native('delete;', 'id1', 'id2')) w,
ARRAYTABLE(w.tuple COLUMNS "updatecount" integer) AS x
上記のコードを形成し、「delete;" キーワードの後に varargs から削除する ids」が続きます。
Create example
SELECT x.* FROM (call sf_source.native('create;type=table;attributes=one,two,three', 'one', 2, 3.0)) w, ARRAYTABLE(w.tuple COLUMNS "update_count" integer) AS x
SELECT x.* FROM
(call sf_source.native('create;type=table;attributes=one,two,three', 'one', 2, 3.0)) w,
ARRAYTABLE(w.tuple COLUMNS "update_count" integer) AS x
上記のコードを形成するには、「create」または「update」キーワードの後に以下のプロパティーを指定する必要があります。これらの属性は、手順変数によって位置で一致する必要があります。そのため、例の属性 2 は 2 に設定されます。
プロパティー名 | 説明 | 必須 |
---|---|---|
type | テーブル名 | はい |
attributes | 列の名前のコンマ区切りリスト | いいえ |
各属性の値は、「ネイティブ」手順に個別の引数として指定されます。
update は、レコードの識別子を定義する、さらに 1 つの追加プロパティー「id」で create と似ています。
更新の例
SELECT x.* FROM (call sf_source.native('update;id=pk;type=table;attributes=one,two,three', 'one', 2, 3.0)) w, ARRAYTABLE(w.tuple COLUMNS "update_count" integer) AS x
SELECT x.* FROM
(call sf_source.native('update;id=pk;type=table;attributes=one,two,three', 'one', 2, 3.0)) w,
ARRAYTABLE(w.tuple COLUMNS "update_count" integer) AS x
デフォルトでは、クエリーを直接実行する手順の名前は native と呼ばれますが、DDL ファイルにオーバーライドの実行プロパティーを設定して変更することができます。