Skip to main content

Snowflake

Overview

The Snowflake source allows you to sync data from Snowflake. It supports both Full Refresh and Incremental syncs. You can choose whether this connector will copy only new or updated data, or all rows in the tables and columns you set up for replication, every time a sync is run.

This Snowflake source connector is built on top of the source-jdbc code base and is configured to rely on the JDBC 3.14.1 Snowflake driver as described in the Snowflake documentation.

Resulting schema

The Snowflake source does not alter the schema present in your warehouse. Depending on the destination connected to this source, however, the result schema may be altered. See the destination's documentation for more details.

Features

FeatureSupported?(Yes/No)Notes
Full Refresh SyncYes
Incremental - Append SyncYes
NamespacesYes

Incremental Sync

The Snowflake source connector supports incremental sync, which allows you to replicate only new or updated data since the last sync. This is accomplished using a cursor field that tracks the state of the sync.

How Incremental Sync Works

During incremental sync, the connector:

  1. Identifies new records: Uses a WHERE cursor_field > last_cursor_value clause to fetch only records newer than the last synced value
  2. Maintains order: Applies ORDER BY cursor_field ASC to ensure records are processed in the correct sequence
  3. Tracks state: Stores the maximum cursor value from each sync to use as the starting point for the next sync

Supported Cursor Field Data Types

The connector supports the following JDBC data types as cursor fields:

Date and Time Types:

  • TIMESTAMP_WITH_TIMEZONE
  • TIMESTAMP
  • TIME_WITH_TIMEZONE
  • TIME
  • DATE

Numeric Types:

  • TINYINT
  • SMALLINT
  • INTEGER
  • BIGINT
  • FLOAT
  • DOUBLE
  • REAL
  • NUMERIC
  • DECIMAL

String Types:

  • NVARCHAR
  • VARCHAR
  • LONGVARCHAR

Choosing a Cursor Field

For effective incremental sync, choose cursor fields that:

  • Are monotonically increasing: Values should always increase over time (e.g., auto-incrementing IDs, creation timestamps)
  • Are never updated: Avoid fields that might be modified after record creation
  • Have unique values: While duplicate values are handled, they can cause records to be skipped or re-synced
  • Are indexed: For better query performance on large tables

Good cursor field examples:

  • CREATED_AT or UPDATED_AT timestamp columns
  • Auto-incrementing ID columns
  • Sequence-generated numeric fields

Avoid using:

  • Fields that can be updated after creation
  • Fields with many duplicate values
  • Fields that can contain NULL values

Snowflake-Specific Considerations

Timezone Handling: The connector provides special handling for Snowflake's TIMESTAMPLTZ (timestamp with local timezone) data type, automatically converting it to TIMESTAMP_WITH_TIMEZONE for consistent processing.

Data Type Precision: Snowflake's numeric types maintain their precision during sync. Ensure your destination can handle the precision of your cursor fields.

Configuring Incremental Sync

To set up incremental sync in Airbyte:

  1. Create or edit your connection in the Airbyte UI
  2. Select your source tables that you want to sync incrementally
  3. Choose "Incremental | Append" sync mode for each table
  4. Select a cursor field from the dropdown list of available fields
  5. Verify the cursor field meets the criteria listed above (monotonically increasing, never updated, etc.)

The Airbyte UI will automatically validate that your chosen cursor field is compatible with incremental sync and will show you the supported data types for your specific table schema.

Troubleshooting Incremental Sync

Cursor field validation errors: If you receive an error about an invalid cursor field, ensure the field exists in your table and is one of the supported data types listed above.

Duplicate cursor values: When multiple records have the same cursor value, the connector processes all records with that value. This may result in some records being synced multiple times across different sync runs.

NULL cursor values: Records with NULL cursor field values are excluded from incremental sync. Ensure your cursor field has a NOT NULL constraint or default value.

State reset: If you need to re-sync all data, you can reset the connection's state in the Airbyte UI, which will cause the next sync to behave like a full refresh.

Getting started

Requirements

You'll need the following information to configure the Snowflake source:

  1. Host
  2. Role
  3. Warehouse
  4. Database
  5. Schema
  6. Username
  7. Password
  8. JDBC URL Params (Optional)

Additionally, create a dedicated read-only Airbyte user and role with access to all schemas needed for replication.

Setup guide

Connection parameters

Additional information about Snowflake connection parameters can be found in the Snowflake documentation.

This step is optional but highly recommended for better permission control and auditing. Alternatively, you can use Airbyte with an existing user in your database.

To create a dedicated database user, run the following commands against your database:

-- set variables (these need to be uppercase)
SET AIRBYTE_ROLE = 'AIRBYTE_ROLE';
SET AIRBYTE_USERNAME = 'AIRBYTE_USER';

-- set user password
SET AIRBYTE_PASSWORD = '-password-';

BEGIN;

-- create Airbyte role
CREATE ROLE IF NOT EXISTS $AIRBYTE_ROLE;

-- create Airbyte user
CREATE USER IF NOT EXISTS $AIRBYTE_USERNAME
PASSWORD = $AIRBYTE_PASSWORD
DEFAULT_ROLE = $AIRBYTE_ROLE
DEFAULT_WAREHOUSE= $AIRBYTE_WAREHOUSE;

-- grant Airbyte schema access
GRANT OWNERSHIP ON SCHEMA $AIRBYTE_SCHEMA TO ROLE $AIRBYTE_ROLE;

COMMIT;

You can limit this grant to specific schemas instead of the whole database. Note that to replicate data from multiple Snowflake databases, you can re-run the command above to grant access to all the relevant schemas, but you'll need to set up multiple sources connecting to the same database on multiple schemas.

Your database user should now be ready for use with Airbyte.

Authentication

Login and Password

FieldDescription
HostThe host domain of the snowflake instance (must include the account, region, cloud environment, and end with snowflakecomputing.com). Example: accountname.us-east-2.aws.snowflakecomputing.com
RoleThe role you created for Airbyte to access Snowflake. Example: AIRBYTE_ROLE
WarehouseThe warehouse you created for Airbyte to sync data into. Example: AIRBYTE_WAREHOUSE
DatabaseThe database you created for Airbyte to sync data into. Example: AIRBYTE_DATABASE
SchemaThe schema whose tables this replication is targeting. If no schema is specified, all tables with permission will be presented regardless of their schema.
UsernameThe username you created to allow Airbyte to access the database. Example: AIRBYTE_USER
PasswordThe password associated with the username.
JDBC URL Params (Optional)Additional properties to pass to the JDBC URL string when connecting to the database formatted as key=value pairs separated by the symbol &. Example: key1=value1&key2=value2&key3=value3

Key pair authentication

To configure key pair authentication, you will need a private/public key pair. If you do not have the key pair yet, you can generate one using the openssl command line tool. Use this command to generate an unencrypted private key file:

openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt

Alternatively, use this command to generate an encrypted private key file:

openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -v1 PBE-SHA1-RC4-128 -out rsa_key.p8

Once you have your private key, you need to generate a matching public key. You can do this with the following command:

openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub

Finally, you need to add the public key to your Snowflake user account. You can do this with the following SQL command in Snowflake:

alter user <user_name> set rsa_public_key=<public_key_value>;

and replace <user_name> with your user name and <public_key_value> with your public key.

Network policies

By default, Snowflake allows users to connect to the service from any computer or device IP address. A security administrator (i.e. users with the SECURITYADMIN role) or higher can create a network policy to allow or deny access to a single IP address or a list of addresses.

If you have any issues connecting with Airbyte Cloud, please make sure that the list of IP addresses is on the allowed list.

To determine whether a network policy is set on your account or for a specific user, execute the SHOW PARAMETERS command.

Account

SHOW PARAMETERS LIKE 'network_policy' IN ACCOUNT;

User

SHOW PARAMETERS LIKE 'network_policy' IN USER <username>;

To read more, please check the official Snowflake documentation.

Reference

Config fields reference

Field
Type
Property name
string
database
string
host
string
role
string
warehouse
object
credentials
string
jdbc_url_params
string
schema

Changelog

Expand to review
VersionDatePull RequestSubject
0.3.62025-01-1051504Use a non root base image
0.3.52024-12-1849911Use a base image: airbyte/java-connector-base:1.0.0
0.3.42024-10-3148073Upgrade jdbc driver
0.3.32024-06-2840424Support Snowflake key pair authentication
0.3.22024-02-1338317Hide oAuth option from connector
0.3.12024-02-1335220Adopt CDK 0.20.4
0.3.12024-01-2434453bump CDK version
0.3.02023-12-1833484Remove LEGACY state
0.2.22023-10-2031613Fixed handling of TIMESTAMP_TZ columns. upgrade
0.2.12023-10-1131252Snowflake JDBC version upgrade
0.2.02023-06-2627737License Update: Elv2
0.1.362023-06-2027212Fix silent exception swallowing in StreamingJdbcDatabase
0.1.352023-06-1427335Remove noisy debug logs
0.1.342023-03-3024693Fix failure with TIMESTAMP_WITH_TIMEZONE column being used as cursor
0.1.332023-03-2924667Fix bug which wont allow TIMESTAMP_WITH_TIMEZONE column to be used as a cursor
0.1.322023-03-2220760Removed redundant date-time datatypes formatting
0.1.312023-03-0623455For network isolation, source connector accepts a list of hosts it is allowed to connect to
0.1.302023-02-2122358Improved handling of big integer cursor type values.
0.1.292022-12-1420436Consolidate date/time values mapping for JDBC sources.
0.1.282023-01-0620465Improve the schema config field to only discover tables from the specified scehma and make the field optional
0.1.272022-12-1420407Fix an issue with integer values converted to floats during replication
0.1.262022-11-1019314Set application id in JDBC URL params based on OSS/Cloud environment
0.1.252022-11-1015535Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode
0.1.242022-09-2617144Fixed bug with incorrect date-time datatypes handling
0.1.232022-09-2617116added connection string identifier
0.1.222022-09-2116766Update JDBC Driver version to 3.13.22
0.1.212022-09-1415668Wrap logs in AirbyteLogMessage
0.1.202022-09-0116258Emit state messages more frequently
0.1.192022-08-1915797Allow using role during oauth
0.1.182022-08-1814356DB Sources: only show a table can sync incrementally if at least one column can be used as a cursor field
0.1.172022-08-0915314Discover integer columns as integers rather than floats
0.1.162022-08-0415314(broken, do not use) Discover integer columns as integers rather than floats
0.1.152022-07-2214828Source Snowflake: Source/Destination doesn't respect DATE data type
0.1.142022-07-2214714Clarified error message when invalid cursor column selected
0.1.132022-07-1414574Removed additionalProperties:false from JDBC source connectors
0.1.122022-04-2912480Query tables with adaptive fetch size to optimize JDBC memory consumption
0.1.112022-04-2710953Implement OAuth flow
0.1.92022-02-2110242Fixed cursor for old connectors that use non-microsecond format. Now connectors work with both formats
0.1.82022-02-1810242Updated timestamp transformation with microseconds
0.1.72022-02-1410256Add -XX:+ExitOnOutOfMemoryError JVM option
0.1.62022-01-259623Add jdbc_url_params support for optional JDBC parameters
0.1.52022-01-199567Added parameter for keeping JDBC session alive
0.1.42021-12-309203Update connector fields title/description
0.1.32021-01-119304Upgrade version of JDBC driver
0.1.22021-10-217257Fixed parsing of extreme values for FLOAT and NUMBER data types
0.1.12021-08-134699Added json config validator