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

# Snowflake Target

The Snowflake Target Connector is a robust tool designed to facilitate the seamless integration of Change Data Capture (CDC) updates into Snowflake data warehouses. Leveraging Snowpipe streaming functionality, this connector efficiently streams CDC updates into Snowflake, where they are written as inserts. Subsequently, a materialized view is employed to construct a copy of the source table, ensuring real-time data replication.

## Key Features

* **CDC Streaming:** utilizes Snowpipe streaming to deliver real-time changes from the source system.
* **Insert Operation:** writes CDC updates as inserts into the target Snowflake database, preserving the full change history.
* **Materialized View:** constructs a materialized view to mirror the source table, enabling easy access to replicated data.
* **Time Travel Support:** retains historical data for time travel queries, facilitating data analysis and auditing.
* **Key-Pair Authentication:** relies on Snowflake's key-pair authentication mechanism — no passwords.
* **Schema evolution:** new columns are added automatically as the source schema evolves.

## Prerequisites

* A Snowflake account where you wish to sync your data.
* A **role** with the required permissions on the target database and schema:
  * `USAGE` on the database and schema
  * `CREATE TABLE` on the schema
  * `INSERT`, `UPDATE`, `DELETE` on target tables
* A **key pair** (no passphrase) for authentication. To set it up:

  1. Generate the key pair:
     ```bash theme={null}
     openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
     openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
     ```
  2. Register the public key on the Snowflake user:
     ```sql theme={null}
     ALTER USER <your_user> SET RSA_PUBLIC_KEY='<public_key_body>';
     ```
  3. Copy the private key **without** the header and footer lines:
     ```
     -----BEGIN PRIVATE KEY-----
     -----END PRIVATE KEY-----
     ```

## Configuration

| Field                   | Required | Description                                                                                                                            |
| ----------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| **Account**             | Yes      | Snowflake account identifier (e.g. `myorg-myaccount` or `account.region.cloud`)                                                        |
| **User**                | Yes      | Username configured with key-pair authentication                                                                                       |
| **Database**            | Yes      | Database where tables will be created (e.g. `ANALYTICS_DB`)                                                                            |
| **Schema**              | Yes      | Schema within the database (e.g. `PUBLIC`)                                                                                             |
| **Role**                | Yes      | Role to use for the session — must have write access to the target schema                                                              |
| **Private Key**         | Yes      | The private key body, without headers                                                                                                  |
| **Enable Before/After** | Yes      | When enabled, stores both the **before** and **after** images of each change event, allowing field-level change tracking in the target |

## How It Works

For each subscription, Popsink creates tables in the target schema and applies CDC events to keep Snowflake in sync with the source. Updates are streamed as inserts via Snowpipe streaming, and a materialized view exposes the latest state of each table. Schema evolution is handled automatically — new columns are added as the source schema evolves.
