# Snowflake
Snowflake は、クラウドに構築されたリレーショナル ANSI SQL データウェアハウスです。クラウド向けに設計されたユニークなアーキテクチャのおかげで、Snowflake はより迅速で、使いやすく、従来のデータウェアハウスよりもはるかに柔軟性のあるデータウェアハウスを提供します。
# Workato での Snowflake への接続方法
Snowflake コネクターは、Snowflake での認証に OAuth 2.0またはユーザー名とパスワードを使用します。Snowflake インスタンスに IP アドレスに基づいたアクセスを制限するネットワークポリシーがある場合は、コネクションを正常に作成するために、Workato の IP アドレスを許可リストに追加する必要があります。
Snowflake コネクション
項目 | 説明 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Connection name | この Snowflake コネクションに対して、接続先の Snowflake インスタンスを識別する一意の名前を付けます。 | ||||||||||||
Account name | Snowflake インスタンスのアカウント名。Snowflake がホストされているクラウドプラットフォーム (AWS または Azure) およびリージョンによっては追加のセグメントが必要になる場合があります。
| ||||||||||||
Authentication type | このコネクションに対する認証タイプを選択します。ユーザー名/パスワードまたは OAuth 2.0のどちらかを選択してください。 | ||||||||||||
Warehouse | このコネクションのすべてのコンピューティングを実行するために使用されるウェアハウスの名前。詳細については、ウェアハウスについての考慮事項のセクションを参照してください。 | ||||||||||||
Database | 接続する Snowflake データベースの名前。 | ||||||||||||
Username | Snowflake に接続するためのユーザー名。
ユーザーに付与されるロールには、SYSADMIN 以下の権限が必要です。 ユーザー名/パスワードの認証タイプを選択した場合には必須です。 | ||||||||||||
Password | Snowflake に接続するためのパスワード。
ユーザーに付与されるロールには、SYSADMIN 以下の権限が必要です。 ユーザー名/パスワードの認証タイプを選択した場合には必須です。 | ||||||||||||
Client ID | クライアント ID は OAuth 2.0認証フローとトークン要求に使用されます。OAuth 2.0の設定の詳細については、こちらを参照してください。
OAuth 2.0認証タイプを選択した場合には必須です。 | ||||||||||||
Client secret | OAuth 2.0トークン要求に使用されるクライアントシークレット。
OAuth 2.0認証タイプを選択した場合には必須です。 | ||||||||||||
Schema | 任意。接続する Snowflake データベース内のスキーマの名前。デフォルトは public スキーマです。 | ||||||||||||
Database timezone | 任意。これをタイムゾーンのないすべてのタイムスタンプに適用します。 |
Workato に接続された Snowflake アカウントは、こちら (opens new window)で詳細を説明するセキュリティ上の考慮事項に準拠したものである必要があります。一般的なガイドラインとして、SYSADMIN 権限を使用できますが、レシピの作成に使用する Snowflake オブジェクト のみ に Workato のアクセスを制限するには、カスタムロールを作成する必要があります。ACCOUNTADMIN 権限を持つユーザーを Workato に接続しないでください。これによりエラーがスローされ、セキュリティ上の懸念も生じるためです。
# Snowflake コネクターの使用
# OAuth 2.0の設定
Snowflake コネクションに OAuth 2.0認証タイプを使用するには、まずクライアント ID とシークレットのセットを作成する必要があります。そのためには、カスタムインテグレーションレコードを作成する必要があります。使用する適切なリダイレクト URL が含まれる例を以下に示します。
CREATE SECURITY INTEGRATION WORKATO_OAUTH
TYPE = OAUTH
ENABLED = TRUE
OAUTH_CLIENT = CUSTOM
OAUTH_CLIENT_TYPE = CONFIDENTIAL
OAUTH_REDIRECT_URI = 'https://www.workato.com/oauth/callback'
OAUTH_ISSUE_REFRESH_TOKENS = TRUE;
このインテグレーションレコードが正常に作成されたら、以下の SQL コマンドを使用してクライアント ID とシークレットを取得できます。
SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('WORKATO_OAUTH');
権限が必要
これらの SQL コマンドを実行するには、ACCOUNTADMIN ロールまたはグローバル CREATE INTEGRATION
権限を持つロールを使用する必要があります。
詳細については、Snowflake のドキュメント (opens new window)を参照してください。
# ウェアハウスについての考慮事項
Snowflake では、すべてのコンピューティング (読み込み、変換、クエリー) に秒単位の課金を使用します。Snowflake コネクション向けにウェアハウスを設定する際は、いくつか考慮することがあります。ウェアハウスの最小課金時間は60秒であるため、再開してから60秒以内にウェアハウスを一時停止することにメリットはありません。
以下のウェアハウスのプロパティを選択する際は、クエリーの頻度と時間間隔、同時実行されるアクティブなレシピ数、および各クエリーの複雑さについて考慮する必要があります。
# Warehouse size (ウェアハウスのサイズ)
ほとんどのユースケースでは XS サイズのウェアハウスで十分です。より大きなウェアハウスにはより多くのサーバーがあり、秒単位のコストに比例してより多くの処理を実行できます。つまり、より大規模なウェアハウスでは、同じ数のクレジットを消費しながら、より短時間でクエリーを完了することができます。
長くて複雑なクエリーを含むユースケースでは、タイムアウトを防ぐためにより大規模なウェアハウスを使用することをお勧めします。
# Multi-cluster warehouses (マルチクラスターウェアハウス)
自動スケールが有効なマルチクラスターウェアハウスでは、(同じサイズの) 複数のウェアハウスを作成して一時的なワークロードの変動に対応できます。
同時実行ジョブまたは大規模なクエリーを含むジョブを実行することが予想される場合は、マルチクラスターウェアハウスを使用してください。マルチクラスターウェアハウスの詳細については、こちら (opens new window)を参照してください。
# 自動中断と自動再開
コネクションで使用するウェアハウスは、自動再開が有効である必要があります。そうでない場合、中断されたウェアハウスに対してレシピジョブを実行しようとするとエラーが発生します。
非アクティブ状態が一定時間続いた後に自動中断するようウェアハウスを設定できます。指定する時間はビジネスプロセスに応じて異なります。
実行中のウェアハウスでは、テーブルデータのキャッシュが維持されます。テーブルから再びデータを読み取る代わりにキャッシュされたデータを使用できれば、後続のクエリーにかかる時間を減らすことができます。大規模なウェアハウスには大規模なキャッシュ容量があります。このキャッシュはウェアハウスの中断時に削除されます。そのため、自動再開されたウェアハウスに対する最初のクエリーではパフォーマンスが低下します。
クエリーの実行頻度が高くダウンタイムが短いユースケースでは、自動中断までの時間を長く設定することでメリットを享受できます。
# Database timezone (データベースのタイムゾーン)
Snowflake では TIMESTAMP_NTZ データ型 (タイムゾーンのない「wallclock」時間情報) がサポートされます。これは外部システムとの統合において課題となります。当該列との間でデータの送信や読み取りを行う場合、正確に処理するためには、データを他のアプリケーションの API のデフォルトのタイムゾーンに変換する必要があります。
データベースが稼働するタイムゾーンを選択してください。このタイムゾーンは当該列にのみ適用されます。明示されたタイムゾーン値を持つその他のタイムスタンプ列は影響を受けません。
空白のままにすると、代わりに Workato アカウントのタイムゾーンが使用されます。
テーブル内のこのような列にタイムスタンプ値を 書き込む と、その値はまず指定されたタイムゾーンに変換されます。その後、「wallclock」の値のみが格納されます。
テーブル内のタイムゾーン値を持たないタイムスタンプを 読み取る 場合、そのタイムスタンプは選択されたタイムゾーンに割り当てられ、タイムゾーン値を持つタイムスタンプとして処理されます。
# テーブルとビュー
Snowflake コネクターでは、接続の確立に使用されるユーザー名に対して利用可能なすべてのテーブルとビューを操作できます。ユーザーは、それらを各トリガー/アクションのピックリストで利用することも、正確な名前を指定することもできます。
ピックリストからテーブル/ビューを選択
正確なテーブル/ビュー名をテキストフィールドに入力
# 単一行とバッチ行
Snowflake コネクターでは、単一行またはバッチ行でデータベースの読み取りや書き込みを実行できます。バッチ行を使用したトリガー/アクションでは、操作するバッチのサイズを入力する必要があります。バッチサイズには1~100の間の任意の数字を指定できます。最大バッチサイズは100です。
これら2つの操作には、入力項目の違いに加えて、出力にも違いがあります。バッチトリガーは、リストデータピル (行の配列など) を返します。
バッチトリガーの出力
リストデータピル
Rows データピルは、出力がそのバッチ内の各行のデータを含むリストであることを示しています。
ただし、一度に1つの行を処理するトリガーには、その単一行のデータをマッピングできる出力データツリーがあります。
単一行の出力
そのため、バッチトリガー/アクションの出力は異なる方法で処理する必要があります。トリガーの出力は、Rows データピルをソースリストにマッピングする必要があるバッチ操作のアクション (Salesforce の Create objects in bulk アクション など) で使用できます。Workato でのリストの操作方法の詳細については、こちらを参照してください。
バッチトリガーの出力を使用する
# WHERE condition
この入力項目を使用すると、アクションを実行する対象行をフィルタリングして識別できます。以下のように、複数のトリガーおよびアクションで使用できます。
- トリガーで取得する行をフィルタリングする
- Select rows アクションで行をフィルタリングする
- Delete rows アクションで削除する行をフィルタリングする
TIP
以下の例では、ユーザー入力で直接 WHERE 条件を使用する方法を示しています。セキュリティを強化するには、WHERE 条件をパラメータとともに使用して SQL インジェクションを防止するようにしてください。詳細については、こちらを参照してください。
この句は各リクエストの WHERE
ステートメントとして使用され、基本的な SQL 構文に従っている必要があります。
# 単純なステートメント
文字列値は一重引用符 (''
) で囲む必要があります。また、使用する列はテーブル/ビューに存在していなければなりません。
単一列の値に基づいて行をフィルタリングする単純な WHERE
条件は、以下のようになります。
email = 'John@acme.com'
Select rows アクションで使用すると、この WHERE
条件は email
列の値が「John@acme.com」であるすべての行を返します。入力の際にデータピルを一重引用符で囲むことを覚えておいてください。
WHERE
条件内で一重引用符で囲まれたデータピルを使用する
列にスペースが含まれる場合、列識別子として二重引用符 (""
) を使用するようにしてください。たとえば、 currency code を識別子として使用するには、括弧で囲まれなければなりません。
"email address" = 'John@acme.com'
二重引用符で囲まれた列識別子を含む WHERE
条件
# 複雑なステートメント
WHERE
条件にサブクエリーを含めることもできます。以下の例では、USERS
テーブルからアクティブなユーザーを選択します。
ID IN(SELECT USER_ID FROM USERS WHERE ACTIVE = TRUE)
Select rows アクションで使用すると、これはアクティブ (ACTIVE = TRUE
) である USERS
テーブル内の行に関連したメインクエリーのすべての行を選択します。
WHERE 条件内でサブクエリーを使用する
# パラメータの使用
パラメータを WHERE
条件と組み合わせて使用すれば、SQL インジェクションに対するセキュリティを強化することができます。パラメータを WHERE
条件で使用するには、まず入力でバインド変数を宣言する必要があります。バインド変数は :bind_variable
の形式で宣言する必要があります。変数名の前には :
が付きます。これが終わったら、直下のセクションで、指定した変数名を使用してパラメータを宣言します。
TIP
バインド変数は、列の名前ではなく、列の値の代わりにのみ使用する必要があります。
バインド変数は必要に応じていくつでも使用できますが、それぞれ固有の名前を指定する必要があります。一重引用符 ('
)、二重引用符 ("
)、および角括弧 ([]
) 内のすべての :
を無視することで、バインド変数を列名および静的値から区別します。
Last updated: 2023/8/31 1:07:14