# Snowflake

## Setup

The following credentials keys are accepted:

* `account` **(required)** -> The hostname or account the instance (eg. `pua90768.us-east-11`)
* `user` **(required)** -> The username to access the instance
* `database` **(required)** -> The database name of the instance
* `password` (optional) -> The password to access the instance
* `schema` (optional) -> The default schema to use
* `role` (optional) -> The role to access the instance
* `warehouse` (optional) -> The warehouse to use
* `passcode` (optional) -> Specifies the passcode provided by Duo when using multi-factor authentication (MFA) for login.
* `authenticator` (optional) -> Specifies the authenticator to use to login (e.g. `snowflake`, `snowflake_jwt`, `externalbrowser`, `oauth`, `programmatic_access_token`, `username_password_mfa`).
* `token` (optional since *v1.5.1*) -> Specifies the token for OAuth or PAT authentication. Required when using `authenticator=programmatic_access_token`.
* `private_key` (optional) -> Specifies the private key body or file path to use.
* `private_key_passphrase` (optional) -> Specifies the private key file passphrase.
* `max_chunk_download_workers` (optional) -> Specifies the Maximum Number of Result Set Chunk Downloader (`integer`).
* `custom_json_decoder_enabled` (optional) -> Specifies to use the Custom JSON Decoder for Parsing Result Set (`true` or `false`).
* `internal_stage` (optional) -> Specifies a custom internal stage to use for bulk operations. If not provided, Sling will attempt to create a stage in the default schema named `SLING_SCHEMA.SLING_STAGING`.
* `copy_method` (optional) -> Specifies to use the platform to use for loading/unloading (`DEFAULT`, `AWS`, `AZURE`). For `AWS` or `AZURE`, you'll need to provide the necessary credentials, such as `aws_bucket`, `aws_access_key_id` and `aws_secret_access_key`, for AWS, or `azure_account`, `azure_container` and `azure_sas_svc_url` for AZURE.
* `use_adbc` (optional) -> Enable Arrow Database Connectivity (ADBC) driver for high-performance data transfer. See [ADBC](https://docs.slingdata.io/connections/database-connections/adbc) for setup and details. (*v1.5.2+*)
* `adbc_uri` (optional) -> Override the automatically constructed ADBC connection URI when using `use_adbc=true`.

### Using `sling conns`

Here are examples of setting a connection named `SNOWFLAKE`. We must provide the `type=snowflake` property:

{% code overflow="wrap" %}

```bash
$ sling conns set SNOWFLAKE type=snowflake account=<account> user=<user> database=<database> password=<password> role=<role>

# Or use url
$ sling conns set SNOWFLAKE url="snowflake://myuser:mypass@host.account/mydatabase?schema=<schema>&role=<role>"
```

{% endcode %}

### Environment Variable

See [here](https://docs.slingdata.io/sling-cli/environment#dot-env-file-.env.sling) to learn more about the `.env.sling` file.

{% code overflow="wrap" %}

```bash
export SNOWFLAKE='snowflake://myuser:mypass@host.account/mydatabase?schema=<schema>&role=<role>'

# use JSON format
export SNOWFLAKE_CONN='{ "type": "snowflake", "account": ..., "private_key": "<private-key-file-path>", "private_key_passphrase": "<passphrase>" }'

# use YAML format (with new lines)
export SNOWFLAKE='
type: snowflake
account: <account>
user: <user>
password: <password>
database: <database>
schema: <schema>
role: <role>
warehouse: <warehouse>
private_key: |
    -----BEGIN PRIVATE KEY-----
    MIIEvgIBADANBgkqhkiG7w0BAQEFAASCBKgwggSkAgEAAoIBAQDFWDdPxN7sKH/i
    ......
    SxUARJ4Rd2euQIEMqSY2UVPlNSaZK4wEq12jhXEM98cINVyKomJcThOHblz5IbV6
    +5I2kK6DCYSY2zm0xzYqeGFN
    -----END PRIVATE KEY-----
'
```

{% endcode %}

### Sling Env File YAML

See [here](https://docs.slingdata.io/sling-cli/environment#sling-env-file-env.yaml) to learn more about the sling `env.yaml` file.

```yaml
connections:
  # Standard password authentication
  SNOWFLAKE:
    type: snowflake
    account: <account>
    user: <user>
    password: <password>
    database: <database>
    schema: <schema>
    role: <role>
    warehouse: <warehouse>

  # Key-pair authentication
  SNOWFLAKE_JWT:
    type: snowflake
    account: <account>
    user: <user>
    database: <database>
    schema: <schema>
    role: <role>
    warehouse: <warehouse>
    authenticator: snowflake_jwt
    private_key: |
        -----BEGIN PRIVATE KEY-----
        MIIEvgIBADANBgkqhkiG7w0BAQEFAASCBKgwggSkAgEAAoIBAQDFWDdPxN7sKH/i
        ......
        SxUARJ4Rd2euQIEMqSY2UVPlNSaZK4wEq12jhXEM98cINVyKomJcThOHblz5IbV6
        +5I2kK6DCYSY2zm0xzYqeGFN
        -----END PRIVATE KEY-----

  # Programmatic Access Token (PAT) authentication
  SNOWFLAKE_PAT:
    type: snowflake
    account: <account>
    user: <user>
    database: <database>
    schema: <schema>
    role: <role>
    warehouse: <warehouse>
    authenticator: programmatic_access_token
    token: <token>  # Your PAT token

  # MFA authentication (with token caching)
  SNOWFLAKE_MFA:
    type: snowflake
    account: <account>
    user: <user>
    password: <password>
    database: <database>
    schema: <schema>
    role: <role>
    warehouse: <warehouse>
    authenticator: username_password_mfa

  # URL format
  SNOWFLAKE_URL:
    url: "snowflake://myuser:mypass@host.account/mydatabase?schema=<schema>&role=<role>"
```

If you are facing issues connecting, please reach out to us at <support@slingdata.io>, on [discord](https://discord.gg/q5xtaSNDvp) or open a Github Issue [here](https://github.com/slingdata-io/sling-cli/issues).
