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

# Snowflake

> SnowflakeからOneSignalにカスタムイベントを同期して、ユーザーの行動に基づいた自動Journeyとパーソナライズされたメッセージングキャンペーンをトリガーします。

export const PLATFORM_0 = "Snowflake"

export const DATA_TYPE_0 = "event data"

export const COLUMN_HEADER_0 = "Snowflake Column"

export const PROPERTIES_DESCRIPTION_0 = "Event metadata as VARIANT/JSON"

<Note>
  OneSignalのレガシー統合でSnowflakeを使用している場合は、[Snowflakeレガシー統合](./snowflake-legacy)ガイドを参照してください。移行手順については[レガシーからの移行](#migrating-from-legacy)を参照してください。
</Note>

***

## 概要

OneSignal + Snowflake統合は、2つの強力なデータパイプラインをサポートしています：

* **アウトバウンド**：OneSignalからSnowflakeにメッセージングイベントデータ（プッシュ、メール、SMS、アプリ内）を自動的に送信し、分析とレポート作成を行います。
* **インバウンド**：Snowflakeデータセットからカスタムユーザーイベントを OneSignalに同期して、自動Journeyとパーソナライズされたメッセージングをトリガーします。

これらの統合により、ユーザーエンゲージメントデータを完全に制御でき、高度な分析とリアルタイムの行動駆動型メッセージングが可能になります。

***

## アウトバウンド設定

<Note>
  現在、アーリーアクセス中です。
  アクセスを要求するには、以下の情報と共に`support@onesignal.com`にお問い合わせください：

  * お客様の会社名
  * OneSignal組織ID
  * 有効にしたいアプリID
</Note>

メッセージングのパフォーマンスとエンゲージメントイベント（送信、開封、クリックなど）をSnowflakeに送信して以下を実現します：

* カスタムダッシュボードとレポートを構築
* チャネル全体の配信とエンゲージメントのトレンドを追跡
* OneSignalデータを他のビジネスデータと組み合わせて分析

**要件**

* OneSignal **Professionalプラン**（無料アプリでは利用できません）
* [Snowflakeアカウント](https://docs.snowflake.com/en/user-guide/getting-started-tutorial)
* Snowflakeでのセットアップ用のSECURITYADMINまたはACCOUNTADMINロール

### 1. Snowflakeアカウントの詳細を収集

統合を構成する前に、Snowflakeアカウントから以下の情報を収集します：

* **Snowflakeホスト**：`<account_identifier>.snowflakecomputing.com`形式のアカウントURL
* **データベース名**：OneSignalがイベントデータを書き込むデータベース
* **スキーマ名**：OneSignalテーブル用のデータベース内のスキーマ（OneSignalによって自動作成されます）
* **ウェアハウス名**：データロード操作に使用するウェアハウス

<Frame caption="Snowflakeアカウント識別子の場所">
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/cf472c3-Screen_Shot_2023-06-27_at_4.08.19_PM.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=ad89f70c336cfa9fc66849021cdab551" width="1554" height="620" data-path="images/docs/cf472c3-Screen_Shot_2023-06-27_at_4.08.19_PM.png" />
</Frame>

### 2. Snowflakeでセットアップスクリプトを実行

Snowflakeウェアハウスで以下のSQLスクリプトを実行して、OneSignalに必要なロール、ユーザー、ウェアハウス、データベースを作成します：

```sql theme={null}
begin;

   -- create variables for user / role / warehouse / database (needs to be uppercase for objects)
   set role_name = 'ONESIGNAL_ROLE';
   set user_name = 'ONESIGNAL_USER';
   set warehouse_name = 'ONESIGNAL_WAREHOUSE';
   set database_name = 'ONESIGNAL';

   -- change role to securityadmin for user / role steps
   use role securityadmin;

   -- create role for onesignal
   create role if not exists identifier($role_name);
   grant role identifier($role_name) to role SYSADMIN;

   -- create a user for onesignal
   create user if not exists identifier($user_name)
   default_role = $role_name
   default_warehouse = $warehouse_name;

   grant role identifier($role_name) to user identifier($user_name);

   -- set binary_input_format to BASE64
   ALTER USER identifier($user_name) SET BINARY_INPUT_FORMAT = 'BASE64';

   -- set timestamp_input_format to AUTO for the user
   ALTER USER identifier($user_name) SET TIMESTAMP_INPUT_FORMAT = 'AUTO';

   -- change role to sysadmin for warehouse / database steps
   use role sysadmin;

   -- create a warehouse for onesignal
   create warehouse if not exists identifier($warehouse_name)
   warehouse_size = xsmall
   warehouse_type = standard
   auto_suspend = 60
   auto_resume = true
   initially_suspended = true;

   -- create database for onesignal
   create database if not exists identifier($database_name);

   -- grant onesignal role access to warehouse
   grant USAGE
   on warehouse identifier($warehouse_name)
   to role identifier($role_name);

   -- grant onesignal access to database
   grant CREATE SCHEMA, MONITOR, USAGE
   on database identifier($database_name)
   to role identifier($role_name);

 commit;
```

<Note>
  スクリプトの上部にある変数値をカスタマイズして、命名規則に合わせることができます。既存のウェアハウスまたはデータベースを使用している場合は、それに応じてスクリプトを変更してください。
</Note>

### 3. 認証用のキーペアを生成

OneSignalは、Snowflakeアカウントへの安全なアクセスのためにキーペア認証を必要とします。キーを生成して構成するには、次の手順に従います：

<Steps>
  <Step title="秘密鍵を生成">
    次のコマンドのいずれかを実行して秘密鍵を生成します：

    **暗号化されていない秘密鍵**（より簡単ですが、安全性は低くなります）：

    ```bash theme={null}
    openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
    ```

    **暗号化された秘密鍵**（本番環境に推奨）：

    ```bash theme={null}
    openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 aes256 -inform PEM -out rsa_key.p8
    ```

    暗号化されたキーを使用する場合は、パスフレーズの作成を求められます。このパスフレーズは安全に保存してください。OneSignalを構成する際に必要になります。
  </Step>

  <Step title="公開鍵を生成">
    秘密鍵から公開鍵を生成します：

    ```bash theme={null}
    openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
    ```
  </Step>

  <Step title="Snowflakeユーザーに公開鍵を割り当て">
    公開鍵ファイルの内容（ヘッダーとフッター行を除く）をコピーし、Snowflakeで次のSQLコマンドを実行します：

    ```sql theme={null}
    ALTER USER ONESIGNAL_USER SET RSA_PUBLIC_KEY='<YOUR_PUBLIC_KEY_CONTENT>';
    ```

    `<YOUR_PUBLIC_KEY_CONTENT>`をキーの内容に置き換えます（`-----BEGIN PUBLIC KEY-----`と`-----END PUBLIC KEY-----`の行は除く）。
  </Step>
</Steps>

<Warning>
  秘密鍵ファイルを安全に保管してください。次のステップでOneSignalに提供する必要があります。秘密鍵を公開したり、バージョン管理にコミットしたりしないでください。
</Warning>

### 4. OneSignalに接続

<Steps>
  <Step title="統合を有効化">
    OneSignalで、**Data > Integrations > Snowflake**に移動します。
  </Step>

  <Step title="詳細を入力">
    * ホスト：`<your_account>.snowflakecomputing.com`
    * ポート：オプション、デフォルトは`443`
    * データベース：例：`ONESIGNAL`
    * ロール：オプション、省略時はユーザーのデフォルトロールを使用
    * ユーザー：例：`ONESIGNAL_USER`
    * 秘密鍵：秘密鍵ファイル（`rsa_key.p8`）の内容を貼り付けます
    * 秘密鍵のパスフレーズ：オプション、秘密鍵が暗号化されている場合のみ
    * データ処理場所：Snowflakeに送信する前にデータが処理される場所
  </Step>

  <Step title="統合を構成">
    * **同期頻度：** 15分ごとの頻度
    * **スキーマ/テーブル名：** `onesignal_events_<app-id>`および`message_events`として事前設定（編集可能）
    * **イベントタイプ：** 同期するイベントを選択—すべてまたは必要なものだけを選択
  </Step>

  <Step title="イベントを選択">
    Snowflakeウェアハウスで受信したいイベントを選択します。
  </Step>

  <Step title="セットアップを完了">
    **Save**をクリックして、成功の確認を待ちます
  </Step>
</Steps>

<Note>
  初回のデータ同期がSnowflakeに表示されるまでに15〜30分かかる場合があります。

  待機中に、プッシュ、メール、アプリ内、またはSMS経由でメッセージを送信して、選択したイベントをトリガーします。
</Note>

### 5. Snowflakeでデータを表示

初回同期が完了したら、OneSignalイベントデータをクエリします：

```sql theme={null}
-- View recent message events
SELECT *
FROM <your-database>.<your-schema>.message_events
ORDER BY _CREATED DESC
LIMIT 100;
```

<Info>
  スキーマの欠落、権限エラー、形式が正しくないイベントなどの問題が発生した場合は、`support@onesignal.com`にお問い合わせください。
</Info>

## メッセージイベントとプロパティ

### メッセージイベントの種類

**プロパティ：** `event_kind`
**タイプ：** `String`

メッセージとイベントの種類（例：`message.push.received`、`message.push.sent`）。

|  メッセージイベント（OneSignal）  |           `event_kind`           | 説明                                                                             |
| :--------------------: | :------------------------------: | ------------------------------------------------------------------------------ |
|        Push Sent       |        `message.push.sent`       | プッシュ通知が正常に送信されました。                                                             |
|      Push Received     |      `message.push.received`     | 配信されたプッシュ（[Confirmed receipt](/docs/ja/confirmed-delivery)を参照）。                |
|      Push Clicked      |      `message.push.clicked`      | ユーザーがプッシュをクリックしました。                                                            |
|       Push Failed      |       `message.push.failed`      | 配信失敗。メッセージレポートを参照してください。                                                       |
|    Push Unsubscribed   |    `message.push.unsubscribed`   | ユーザーがプッシュからサブスクライブ解除しました。                                                      |
|    In-App Impression   |     `message.iam.impression`     | アプリ内メッセージが表示されました。                                                             |
|     In-App Clicked     |       `message.iam.clicked`      | アプリ内メッセージがクリックされました。                                                           |
|   In-App Page Viewed   |   `message.iam.page_displayed`   | アプリ内ページが表示されました。                                                               |
|       Email Sent       |       `message.email.sent`       | メールが配信されました。                                                                   |
|     Email Received     |     `message.email.received`     | 受信者のメールサーバーでメールが受け入れられました。                                                     |
|      Email Opened      |      `message.email.opened`      | メールが開かれました。[Email Reports](/docs/ja/email-message-reports)を参照してください。           |
|   Email Link Clicked   |      `message.email.clicked`     | メール内のリンクがクリックされました。                                                            |
|   Email Unsubscribed   |   `message.email.unsubscribed`   | 受信者がサブスクライブ解除しました。                                                             |
| Email Reported As Spam | `message.email.reported_as_spam` | スパムとしてマークされました。[Email Deliverability](/docs/ja/email-deliverability)を参照してください。 |
|      Email Bounced     |      `message.email.bounced`     | 永続的な配信失敗によるバウンス。                                                               |
|      Email Failed      |      `message.email.failed`      | 配信が失敗しました。                                                                     |
|    Email Suppressed    |    `message.email.suppressed`    | 抑制リストにより抑制されました。                                                               |
|        SMS Sent        |        `message.sms.sent`        | SMSが送信されました。                                                                   |
|      SMS Delivered     |      `message.sms.delivered`     | SMSが正常に配信されました。                                                                |
|       SMS Failed       |       `message.sms.failed`       | SMSの配信に失敗しました。                                                                 |
|     SMS Undelivered    |     `message.sms.undelivered`    | SMSが拒否されたか到達不可能です。                                                             |

### イベントデータスキーマ

ユーザーが生成する各メッセージイベントには、以下のメタデータがレコードに添付されます。

|                        列名                       |    タイプ    | 説明                                   |
| :---------------------------------------------: | :-------: | ------------------------------------ |
|                    `event_id`                   |    UUID   | イベントの一意の識別子                          |
|                `event_timestamp`                | Timestamp | イベント発生時刻                             |
|                   `event_kind`                  |   String  | [イベントの種類](#message-event-kinds)      |
|            `subscription_device_type`           |   String  | デバイスタイプ（例：iOS、Android、Web、Email、SMS） |
|                    `language`                   |   String  | サブスクリプションの言語コード                      |
|                    `version`                    |   String  | 統合バージョン                              |
|                   `device_os`                   |   String  | デバイスのオペレーティングシステムバージョン               |
|                  `device_type`                  |   Number  | 数値デバイスタイプ                            |
|                     `token`                     |   String  | プッシュトークン、電話番号、またはメール                 |
|                `subscription_id`                |    UUID   | Subscription ID                      |
|                   `subscribed`                  |  Boolean  | サブスクリプションステータス                       |
|                  `onesignal_id`                 |    UUID   | OneSignalユーザーID                      |
|                  `last_active`                  |   String  | 最終アクティブタイムスタンプ                       |
|                      `sdk`                      |   String  | OneSignal SDKバージョン                   |
|                  `external_id`                  |   String  | 統合ユーザーIDと一致する必要がある外部ユーザーID           |
|                     `app_id`                    |    UUID   | OneSignalからのApp ID                   |
|                  `template_id`                  |    UUID   | Template ID（該当する場合）                  |
|                   `message_id`                  |    UUID   | メッセージバッチ/リクエストID                     |
|                  `message_name`                 |   String  | メッセージの名前                             |
|                 `message_title`                 |   String  | メッセージタイトル（英語のみ）                      |
|                `message_contents`               |   String  | 切り捨てられたメッセージ本文（英語のみ）                 |
|                 `failure_reason`                |   String  | 失敗理由（プッシュ失敗およびメール失敗イベント用）            |
| `_created`, `_id`, `_index`, `_fivetran_synced` |   *内部使用*  | Fivetran同期メタデータ                      |

### 注意事項

* 保存/アクティブ化後の同期は、完了までにさらに15〜30分かかる場合があります。
* 非アクティブ化しても、非アクティブ化後に最終同期が1回行われる場合があります。
* 効率的なデータ同期を確保するために、システムは自動的にステージングデータセットを作成および管理します。これらのデータセットは、`fivetran_{2つのランダムな単語}_staging`のようなパターンで命名され、メインスキーマに統合される前の処理中にデータを一時的に保存します。これらのステージングデータセットは、合理化されたワークフローを維持するために不可欠であり、削除しないでください。自動的に再作成されます。

***

## レガシーからの移行

現在[レガシーSnowflake統合](./snowflake-legacy)を使用している場合、このセクションでは主な違いとクエリの移行方法について説明します。

### 主な違い

| 機能         | レガシー              | 新版                        |
| ---------- | ----------------- | ------------------------- |
| **同期頻度**   | 24時間              | 15分ごと                     |
| **データ所有権** | 共有データへの読み取り専用アクセス | お客様のSnowflakeアカウントに直接書き込み |
| **データ保持**  | 30日               | お客様が保持期間を制御               |
| **イベント選択** | 全イベント             | 特定のイベントタイプを選択             |

<Warning>
  レガシー統合（30日間保持のデータ共有）からイベントを自分のテーブルにコピーした場合、
  レガシーイベントテーブルは異なるスキーマを使用している可能性があることに注意してください。

  新しい統合ではカラム名が変更され、自動型推論が使用されるため、バックアップテーブルに
  新しいセットアップを向けるとエラーや予期しない結果が生じる可能性があります。

  新しいテーブルを作成し、履歴イベントと新しいイベントを統合する必要がある場合は、
  以下の結合ビューを使用することをお勧めします。
</Warning>

### スキーマの変更

新しい統合はオンデマンドでカラムを作成します。特定のフィールドのデータを含むイベントがない場合、そのカラムはテーブルに存在しません。そのフィールドにデータが表示されると、カラムが自動的に作成されます。

#### カラム名の変更

| レガシーカラム                      | 新カラム               |
| ---------------------------- | ------------------ |
| `EVENT_IMPRESSION_TIMESTAMP` | `EVENT_TIMESTAMP`  |
| `SUBSCRIPTION_LANGUAGE`      | `LANGUAGE`         |
| `MESSAGE_BODY`               | `MESSAGE_CONTENTS` |

### 型推論

新しい統合は自動型推論を使用します。カラムのすべての値が数値（例：すべての`EXTERNAL_ID`値が数値）の場合、カラムは`NUMBER`として型付けされる可能性があります。後で非数値の値が表示されると、カラムの型は`VARCHAR`に昇格されます。

必要に応じて明示的なキャストを使用してください：

```sql theme={null}
WHERE EXTERNAL_ID = '12345'::VARCHAR
```

### クエリの移行

既存のクエリを移行するには：

1. レガシーデータベースへの参照を新しいSnowflakeデータベースを指すように更新
2. 上記のカラム名の変更を考慮
3. 必要に応じて明示的な型キャストを追加

オプションとして、新しい統合テーブルとレガシーバックアップテーブルを結合し、`EVENT_ID`で重複排除する結合ビューを作成できます：

```sql theme={null}
CREATE VIEW your_schema.message_events_combined AS
SELECT * FROM (
  SELECT
    EVENT_ID,
    EVENT_KIND,
    EVENT_TIMESTAMP,
    SUBSCRIPTION_ID,
    LANGUAGE,
    SUBSCRIPTION_TIMEZONE,
    SUBSCRIPTION_DEVICE_TYPE,
    ONESIGNAL_ID,
    EXTERNAL_ID,
    MESSAGE_ID,
    MESSAGE_NAME,
    MESSAGE_TITLE,
    MESSAGE_CONTENTS,
    ROW_NUMBER() OVER (PARTITION BY EVENT_ID ORDER BY EVENT_TIMESTAMP DESC) AS row_num
  FROM (
    -- New integration data
    SELECT
      EVENT_ID,
      EVENT_KIND,
      EVENT_TIMESTAMP,
      SUBSCRIPTION_ID,
      LANGUAGE,
      SUBSCRIPTION_TIMEZONE,
      SUBSCRIPTION_DEVICE_TYPE,
      ONESIGNAL_ID,
      EXTERNAL_ID,
      MESSAGE_ID,
      MESSAGE_NAME,
      MESSAGE_TITLE,
      MESSAGE_CONTENTS
    FROM <new-database>.<new-schema>.MESSAGE_EVENTS

    UNION ALL

    -- Legacy backup data (aliased to match new column names)
    SELECT
      EVENT_ID,
      EVENT_KIND,
      EVENT_IMPRESSION_TIMESTAMP AS EVENT_TIMESTAMP,
      SUBSCRIPTION_ID,
      SUBSCRIPTION_LANGUAGE AS LANGUAGE,
      SUBSCRIPTION_TIMEZONE,
      SUBSCRIPTION_DEVICE_TYPE,
      ONESIGNAL_ID,
      EXTERNAL_ID,
      MESSAGE_ID,
      MESSAGE_NAME,
      MESSAGE_TITLE,
      MESSAGE_BODY AS MESSAGE_CONTENTS
    FROM <legacy-backup-database>.<legacy-backup-schema>.MESSAGE_EVENTS
  )
)
WHERE row_num = 1;
```

<Note>
  `<new-database>.<new-schema>`を新しい統合のデータベースとスキーマに置き換えてください。

  `<legacy-backup-database>.<legacy-backup-schema>`をレガシー共有データのバックアップ先に置き換えてください。

  このビューは履歴データと新しいデータを統合し、`EVENT_ID`で重複排除するため、
  両方のソースに表示されるイベントは1回のみカウントされます。これは、移行中に
  両方の統合を同時に実行する場合に特に重要です。
</Note>

レガシーデータ共有を切断するには、[snowflake-data-sharing@onesignal.com](mailto:snowflake-data-sharing@onesignal.com)にお問い合わせください。

***

## インバウンド設定

SnowflakeからOneSignalに行動イベントデータを送信して以下を実現します：

* ユーザーアクティビティに基づいてJourneyをトリガー
* 行動データに基づいてメッセージングをパーソナライズ

**要件**

* アウトバウンドメッセージイベント用の[Event Streams](/docs/ja/event-streams)へのアクセス（プランの制限と超過料金が適用されます）
* インバウンドイベント同期用の[Custom Events](/docs/ja/custom-events)へのアクセス（プランの制限と超過料金が適用されます）
* [更新されたアカウントプラン](https://onesignal.com/pricing)（無料アプリでは利用できません）

- ウェアハウスアクセス権を持つ**Snowflakeアカウント**
- Snowflakeテーブルまたはビューに保存された**イベントデータ**
- OneSignalからSnowflakeインスタンスへの**ネットワーク接続**
- 適切な権限を持つ**ユーザー認証情報**

<Steps>
  <Step title="OneSignal専用のロールを作成">
    Snowflakeのベストプラクティスに従ってロール階層を作成します：

    ```sql theme={null}
    -- Create a role for the census user
    CREATE ROLE CENSUS_ROLE;

    -- Ensure the sysadmin role inherits any privileges the census role is granted
    GRANT ROLE CENSUS_ROLE TO ROLE SYSADMIN;
    ```
  </Step>

  <Step title="専用ウェアハウスを作成">
    OneSignal操作用にコスト最適化されたウェアハウスを作成します：

    ```sql theme={null}
    -- Create a warehouse for the census role, optimizing for cost over performance
    CREATE WAREHOUSE CENSUS_WAREHOUSE WITH
        WAREHOUSE_SIZE = XSMALL
        AUTO_SUSPEND = 60
        AUTO_RESUME = TRUE
        INITIALLY_SUSPENDED = FALSE;

    GRANT USAGE ON WAREHOUSE CENSUS_WAREHOUSE TO ROLE CENSUS_ROLE;
    GRANT OPERATE ON WAREHOUSE CENSUS_WAREHOUSE TO ROLE CENSUS_ROLE;
    GRANT MONITOR ON WAREHOUSE CENSUS_WAREHOUSE TO ROLE CENSUS_ROLE;
    ```
  </Step>

  <Step title="ユーザーを作成して権限を付与">
    OneSignalユーザーを作成し、イベントデータへのアクセスを許可します：

    ```sql theme={null}
    -- Create the census user
    CREATE USER CENSUS WITH
        DEFAULT_ROLE = CENSUS_ROLE
        DEFAULT_WAREHOUSE = CENSUS_WAREHOUSE
        PASSWORD = '<strong-unique-password>';

    GRANT ROLE CENSUS_ROLE TO USER CENSUS;

    -- Grant access to your event data (replace with your actual database/schema)
    GRANT USAGE ON DATABASE "<your-database>" TO ROLE CENSUS_ROLE;
    GRANT USAGE ON SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON ALL TABLES IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON FUTURE TABLES IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON ALL VIEWS IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON FUTURE VIEWS IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    ```
  </Step>

  <Step title="記帳データベースを作成（高度な同期エンジン）">
    OneSignalの同期状態管理用のプライベートデータベースを作成します：

    ```sql theme={null}
    -- Create a private bookkeeping database
    CREATE DATABASE "CENSUS";
    GRANT ALL PRIVILEGES ON DATABASE "CENSUS" TO ROLE CENSUS_ROLE;

    CREATE SCHEMA "CENSUS"."CENSUS";
    GRANT ALL PRIVILEGES ON SCHEMA "CENSUS"."CENSUS" TO ROLE CENSUS_ROLE;
    GRANT CREATE STAGE ON SCHEMA "CENSUS"."CENSUS" TO ROLE CENSUS_ROLE;
    ```

    <Warning>
      基本同期エンジンまたは読み取り専用モードを使用する場合は、このステップをスキップしてください。
    </Warning>
  </Step>

  <Step title="認証を設定">
    セキュリティを強化するために、キーペア認証（推奨）を設定します：

    1. [Snowflakeのドキュメント](https://docs.snowflake.com/en/user-guide/key-pair-auth)に従って公開鍵/秘密鍵のペアを生成します
    2. Snowflakeユーザーに公開鍵を設定します
    3. OneSignalの接続設定で秘密鍵を使用します

    または、パスワード認証を使用することもできます（非推奨 - 2025年11月にブロックされます）。
  </Step>

  <Step title="OneSignalに接続">
    OneSignalで、**Data > Integrations**に移動し、**Add Integration**をクリックします。

    **Snowflake**を選択し、以下の接続詳細を入力します：

    * **アカウント名：** Snowflakeアカウント識別子（例：`abc123.us-east-1`）
    * **ウェアハウス：** `CENSUS_WAREHOUSE`
    * **ユーザー：** `CENSUS`
    * **データベース：** イベントデータのデータベース名
    * **スキーマ：** イベントデータのスキーマ名
    * **認証：** キーペア（秘密鍵とオプションのパスフレーズを提供）
  </Step>
</Steps>

***

### イベントデータマッピング

{PLATFORM_0} {DATA_TYPE_0}をOneSignalのカスタムイベント形式にマッピングします：

| OneSignalフィールド | {COLUMN_HEADER_0} | 説明                         | 必須  |
| -------------- | ----------------- | -------------------------- | --- |
| `name`         | `event_name`      | イベント識別子                    | はい  |
| `external_id`  | `user_id`         | ユーザー識別子                    | はい  |
| `timestamp`    | `event_timestamp` | イベントが発生した時刻                | いいえ |
| `properties`   | `event_data`      | {PROPERTIES_DESCRIPTION_0} | いいえ |

#### イベントテーブルスキーマの例

```sql theme={null}
-- Example Snowflake event table
CREATE TABLE analytics.user_events (
    event_id STRING,
    event_name STRING NOT NULL,
    user_id STRING NOT NULL,
    event_timestamp TIMESTAMP_TZ DEFAULT CURRENT_TIMESTAMP(),
    event_properties VARIANT,
    session_id STRING,
    device_type STRING
);
```

#### SQLクエリモード

カスタムSQLクエリを記述してイベントデータを変換します：

```sql theme={null}
-- Example: Recent high-value events
SELECT
    event_name,
    user_id,
    event_timestamp,
    event_properties
FROM analytics.user_events
WHERE event_timestamp >= DATEADD(day, -7, CURRENT_TIMESTAMP())
    AND event_properties:value::NUMBER > 100
ORDER BY event_timestamp DESC;
```

### 高度な設定

#### ウェアハウスコストの管理

* コスト最適化のためにX-Smallウェアハウスサイズを使用
* 自動サスペンド（60秒）と自動再開を設定
* オフピーク時間に同期をスケジュール
* 他のバッチ処理システムとウェアハウスを共有することを検討

#### ライブ同期のサポート

リアルタイムイベント処理の場合、イベントテーブルで変更追跡を有効にします：

```sql theme={null}
ALTER TABLE "analytics"."user_events" SET CHANGE_TRACKING = TRUE;
```

#### ネットワークセキュリティ

Snowflakeの許可IPネットワークポリシーを使用している場合は、OneSignalのIPアドレスを許可リストに追加してください。現在のIP範囲については、OneSignalサポートにお問い合わせください。

***

## 制限事項

* 複雑な分析クエリはウェアハウスのパフォーマンスとコストに影響を与える可能性があります
* ユーザー/パスワード認証は2025年11月に非推奨になります
* CENSUSデータベースはOneSignal操作専用に予約されています

***

## FAQ

### どの認証方法を使用すればよいですか？

**キーペア認証**を使用してください（推奨）。ユーザー/パスワード認証は、2025年11月からSnowflakeによってブロックされます。

### 既存のウェアハウスを使用できますか？

はい、dbtやFivetranなどの他のバッチ処理システムとウェアハウスを共有してコストを最適化できます。ウェアハウスにイベント処理のニーズに十分な容量があることを確認してください。

### コストを最適化するにはどうすればよいですか？

* X-Smallウェアハウスサイズを使用
* アグレッシブな自動サスペンド（60秒）を設定
* オフピーク時間に同期をスケジュール
* 連続同期の代わりに時間単位/日次同期を使用

***
