> ## 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.

# Amazon Redshift

> 将 Amazon Redshift 的自定义事件同步到 OneSignal，基于用户行为触发自动化旅程和个性化消息活动。

export const PLATFORM_0 = "Amazon Redshift"

export const DATA_TYPE_0 = "columns"

export const COLUMN_HEADER_0 = "Redshift Column"

export const PROPERTIES_DESCRIPTION_0 = "JSON object with event details"

## 概述

OneSignal + Amazon Redshift 集成可以将您的 Redshift 数据仓库中的自定义事件同步到 OneSignal，以基于用户行为触发自动化消息活动和旅程。

Amazon Redshift 是一个完全托管的、PB 级的数据仓库服务，使您能够使用现有的商业智能工具经济高效地分析大量数据。

***

## 要求

* 访问自定义事件（目前处于测试阶段）
* [升级账户计划](https://onesignal.com/pricing)（免费应用不可用）。

### Amazon Redshift 要求

* 具有网络访问权限的 **Redshift 集群**
* 具有适当权限的**数据库用户**
* 包含结构化行为数据的**事件表**
* 从 OneSignal 到您的 Redshift 集群的**网络连接**

***

## 设置

<Steps>
  <Step title="为 OneSignal 创建专用用户">
    创建一个具有适当权限的专用用户账户：

    ```sql theme={null}
    -- Create OneSignal user with strong password
    CREATE USER CENSUS WITH PASSWORD '<strong-unique-password>';

    -- Create private bookkeeping schema for sync state (skip if read-only mode)
    CREATE SCHEMA CENSUS;

    -- Grant full access to bookkeeping schema (skip if read-only mode)
    GRANT ALL ON SCHEMA CENSUS TO CENSUS;

    -- Ensure access to existing objects in bookkeeping schema (skip if read-only mode)
    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA CENSUS TO CENSUS;
    ```
  </Step>

  <Step title="授予事件数据权限">
    为包含事件数据的模式提供读取访问权限：

    ```sql theme={null}
    -- Grant schema access (repeat for each schema with event data)
    GRANT USAGE ON SCHEMA "<your_schema>" TO CENSUS;

    -- Grant read access to existing tables
    GRANT SELECT ON ALL TABLES IN SCHEMA "<your_schema>" TO CENSUS;

    -- Grant read access to future tables
    ALTER DEFAULT PRIVILEGES IN SCHEMA "<your_schema>" GRANT SELECT ON TABLES TO CENSUS;

    -- Grant execute permissions on functions
    GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA "<your_schema>" TO CENSUS;
    ALTER DEFAULT PRIVILEGES IN SCHEMA "<your_schema>" GRANT EXECUTE ON FUNCTIONS TO CENSUS;
    ```
  </Step>

  <Step title="配置网络访问">
    将 OneSignal 的 IP 地址添加到您的 Redshift 安全组中。Redshift 默认阻止外部访问。

    您可以在集成设置中找到您所在区域的 OneSignal IP 地址。有关更多信息，请访问 AWS Redshift 帮助中心。
  </Step>

  <Step title="连接到 OneSignal">
    在 OneSignal 中，前往 **数据 > 集成**，然后点击 **添加集成**。

    1. 从列表中选择 **Amazon Redshift**
    2. 输入您的连接详细信息：
       * \*\*主机：\*\*您的 Redshift 集群端点
       * \*\*端口：\*\*通常为 5439
       * \*\*数据库：\*\*您的数据库名称
       * **用户名：**`CENSUS`
       * \*\*密码：\*\*您创建的密码
    3. 测试连接
    4. 配置包含事件数据的表
  </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 Redshift event table
CREATE TABLE analytics.user_events (
    event_id BIGINT IDENTITY(1,1),
    event_name VARCHAR(100) NOT NULL,
    user_id VARCHAR(255) NOT NULL,
    event_timestamp TIMESTAMP DEFAULT GETDATE(),
    event_data SUPER,
    session_id VARCHAR(255),
    created_at TIMESTAMP DEFAULT GETDATE()
)
DISTKEY(user_id)
SORTKEY(event_timestamp);
```

### SQL 查询示例

编写自定义 SQL 查询来转换您的事件数据：

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

***

## dbt 集成

如果您在 Redshift 中使用 dbt，请确保 OneSignal 在每次 dbt 运行后保持访问权限：

### 选项1：细粒度权限

在您的 dbt 项目中添加后置钩子，以在每个模型构建后授予访问权限：

```sql theme={null}
-- In your dbt model
{{ config(
    post_hook="GRANT SELECT ON {{ this }} TO CENSUS"
) }}
```

### 选项2：默认权限（推荐）

为您的 dbt 生产用户授予默认权限：

```sql theme={null}
-- Must be run by Redshift superuser
ALTER DEFAULT PRIVILEGES FOR USER "<your_dbt_run_user>"
IN SCHEMA "<your_dbt_target_schema>"
GRANT SELECT ON TABLES TO CENSUS;
```

***

## 高级网络配置

### SSH 隧道配置

对于私有网络上的 Redshift 集群：

1. **创建 SSH 用户**：在您的 SSH 主机上设置专用用户
2. **配置隧道**：在 OneSignal 集成设置中启用“使用 SSH 隧道”
3. **安装密钥对**：将 OneSignal 的公钥添加到 `~/.ssh/authorized_keys`
4. **测试连接**：验证隧道连接

### VPC 配置

对于 AWS VPC 内的 Redshift：

OneSignal 使用 `UNLOAD` 命令进行高效的批量数据提取。VPC 部署需要 **S3 VPC 端点**以允许 Redshift 与 S3 通信。

**设置 S3 VPC 端点：**

1. 在 AWS 控制台中导航到 VPC 服务
2. 为 S3 服务创建 VPC 端点
3. 与您的 Redshift 子网关联
4. 配置路由表

***

## 性能优化

### 分布和排序键

为分析工作负载优化您的事件表：

```sql theme={null}
-- Distribute by user_id for user-centric queries
CREATE TABLE analytics.user_events (
    -- columns
)
DISTKEY(user_id)
SORTKEY(event_timestamp, event_name);
```

### 列式存储

利用 Redshift 的列式存储进行分析：

* **压缩**：Redshift 自动压缩列
* **区域映射**：通过排序数据提高查询性能
* **面向列**：对事件数据的分析查询高效

***

## 限制

* 多个模式需要分别授予权限
* 引用跨模式表的视图需要额外权限
* 复杂的存储过程访问可能需要额外设置
* VPC 部署需要 S3 VPC 端点配置

***

## 常见问题

### OneSignal 如何处理大量事件数据？

OneSignal 使用 Redshift 的 `UNLOAD` 命令进行高效的批量数据提取，该命令为大规模分析工作负载进行了优化。

### 我可以使用只读模式吗？

可以，如果您希望更简单的设置并且不能允许 OneSignal 创建表，您可以跳过记账模式创建并使用只读模式。

### dbt 兼容性怎么样？

OneSignal 提供特定的 dbt 集成模式，以确保在 dbt 运行后维持权限。根据您的设置使用后置钩子或默认权限。
