> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jinba.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Snowflake

> Snowflakeに対してクエリを実行

## 概要

Snowflakeツールを使用すると、Snowflakeデータベースに対してSQLクエリを実行できます。

## 主な機能

* `SNOWFLAKE_RUN_QUERY`
  * Snowflakeに対してSQLクエリを実行します。
  * クエリごとにウェアハウス・データベース・スキーマ・ロールを上書きできます。
  * 結果を構造化されたデータ(カラムと行)として取得します。

## 認証

アカウント識別子・ユーザー名・パスワードを含む `SNOWFLAKE` シークレットを作成してください。パスワード認証のみサポートしています(キーペア認証・OAuthは未対応です)。

* **Account**: Snowflakeアカウント識別子(例: `myorg-myaccount`)。SnowsightのURL `https://app.snowflake.com/<組織名>/<アカウント名>/…` から `<組織名>-<アカウント名>` の形で読み取れます。
* **User**: 接続に使用するSnowflakeユーザー名
* **Password**: そのユーザーのパスワード

**注意**: 認証情報は機密情報として扱い、公開リポジトリにコミットしないでください。

### 推奨: 専用のサービスユーザーを作成する

Snowflakeは人間ユーザーにMFAを強制するため、ツールからのパスワード単独ログインはブロックされることがあります。`TYPE = LEGACY_SERVICE` の専用ユーザーを作成し、権限を明示的に付与してください。権限は階層(ウェアハウス → データベース → スキーマ → テーブル)を**すべて**通す必要があり、1つでも欠けると `Object '…' does not exist or not authorized` エラーになります:

```sql theme={null}
CREATE ROLE JINBA_ROLE;
CREATE USER JINBA_FLOW_USER
  PASSWORD = '<強いパスワード>'
  TYPE = LEGACY_SERVICE
  DEFAULT_ROLE = JINBA_ROLE
  MUST_CHANGE_PASSWORD = FALSE;
GRANT ROLE JINBA_ROLE TO USER JINBA_FLOW_USER;

GRANT USAGE ON WAREHOUSE <ウェアハウス> TO ROLE JINBA_ROLE;
GRANT USAGE ON DATABASE <データベース> TO ROLE JINBA_ROLE;
GRANT USAGE ON SCHEMA <データベース>.<スキーマ> TO ROLE JINBA_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA <データベース>.<スキーマ> TO ROLE JINBA_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA <データベース>.<スキーマ> TO ROLE JINBA_ROLE;
```

## ウェアハウス・データベース・スキーマ・ロール

これらはクエリがどの計算リソース・名前空間で実行されるかを決めるものです。**シークレットには含まれません** — ステップごとの入力として渡すことで、同じシークレットを複数のウェアハウス・データベース・ロールで使い回せます。

* **Warehouse**: クエリを実行する仮想ウェアハウス(計算クラスタ)
* **Database** / **Schema**: クエリの実行対象となる名前空間
* **Role**: セッションで使用するセキュリティロール。省略した場合はユーザーのデフォルトロールが使われます。

実行のたびに新しいセッションが開かれるため、Snowsightのワークシートで実行した `USE WAREHOUSE` / `USE SCHEMA` は引き継がれません。これらの入力を設定するか、クエリ内でテーブル名を完全修飾(`db.schema.table`)してください。

## 大きな整数について

`NUMBER`/`INTEGER` 型の独立したカラムの整数は、安全な範囲(2^53以内)なら通常のJSON数値として、それを超える場合は文字列として返るため、精度は失われません。一方、`VARIANT`/`OBJECT`/`ARRAY` カラムの**中にネストされた**整数はこの保護の対象外で、2^53を超えると精度が落ちる場合があります。SnowflakeのドライバがJSON部分を通常のJSON数値として解析するためです。半構造化データから大きな整数を正確に取得したい場合は、クエリ内で文字列にキャストしてから取得してください(例: `data:big_id::string`)。

### 例: Snowflakeクエリの実行

```yaml theme={null}
- id: run_query
  input:
    - name: connection
      value: "{{secrets.MY_SNOWFLAKE_SECRET}}"
    - name: query
      value: "SELECT * FROM sales_db.public.orders LIMIT 10;"
    - name: warehouse
      value: "COMPUTE_WH"
    - name: database
      value: "SALES_DB"
    - name: schema
      value: "PUBLIC"
  tool: SNOWFLAKE_RUN_QUERY
```
