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

# Snowflake FAQ

> Common questions about connecting Snowflake to Prizm, permissions, scoping, and feature behaviour.

<script type="application/ld+json">
  {`{
            "@context": "https://schema.org",
            "@type": "TechArticle",
            "headline": "Snowflake FAQ",
            "description": "Common questions about connecting Snowflake to Prizm, permissions, scoping, and feature behaviour.",
            "url": "https://docs.dqlabs.ai/sources/snowflake/faq",
            "publisher": {
              "@type": "Organization",
              "name": "DQLabs Inc",
              "logo": "https://media.brand.dev/332adc35-5bc4-4d2b-bf78-256aa4a5e414.svg"
            }
            }`}
</script>

## Connection & Authentication

<AccordionGroup>
  <Accordion title="Are there limits on how many connections I can create?">
    There is no predefined limit on the number of connectors. However, once a Snowflake account is connected as a source, the same account cannot be onboarded multiple times — duplicate account connections are not allowed.
  </Accordion>

  <Accordion title="How is query concurrency managed?">
    Prizm controls concurrency at the job orchestration layer. The settings below govern how many parallel queries run against your Snowflake warehouse at any time. Invalid or inactive sources are excluded from scheduling, reducing unnecessary load.

    | **Setting**                            | **Default**                                    | **Impact**                                             |
    | -------------------------------------- | ---------------------------------------------- | ------------------------------------------------------ |
    | Global concurrent jobs                 | 20 (overridable via `MAX_JOBS` env)            | Caps how many Prizm jobs run in parallel platform-wide |
    | Snowflake technical metadata           | Batch concurrency 8                            | Parallel metadata queries against Snowflake            |
    | Lineage extraction                     | Batch size 100, concurrency 8                  | Parallel `GET_LINEAGE` calls                           |
    | Compute metric / lookup / quality jobs | Per-job-type limits from platform `job_config` | Controls parallel Snowflake MCP/agent calls            |

    For exact concurrency configuration details, contact your Prizm DevOps or platform team.
  </Accordion>

  <Accordion title="Does Prizm support SSO and MFA?">
    Yes. Prizm supports SSO and MFA for user login.
  </Accordion>

  <Accordion title="How do I connect multiple Snowflake accounts?">
    Create a separate connector for each Snowflake account. Each connector has its own credentials, scope configuration, and job schedules. You can name them to distinguish environments (e.g., `snowflake-prod`, `snowflake-dev`).
  </Accordion>

  <Accordion title="How do I monitor multiple databases within one account?">
    Run the permissions SQL script once per database, replacing `<database_name>` each time. Prizm automatically includes all databases the role has been granted `USAGE` on. Alternatively, use the **Include** pattern `*` in the asset scope to include all accessible databases.
  </Accordion>

  <Accordion title="Which authentication methods are supported?">
    Prizm supports Username & Password, Key Pair (RSA), and OAuth 2.0. Key Pair is recommended for production environments — it avoids password rotation disruptions and is compatible with Snowflake IP-allowlist policies.
  </Accordion>

  <Accordion title="Can I use a pre-existing Snowflake role instead of creating PRIZM_ROLE?">
    Yes. Any role with the required grants will work. The SQL script uses `PRIZM_ROLE` as the example name — substitute your preferred role name throughout.
  </Accordion>

  <Accordion title="How do I rotate credentials without downtime?">
    Use Vault to manage your Snowflake credentials when creating the connection. With Vault-backed connections, credential rotation happens entirely within your secrets manager — you update the secret in Vault, and Prizm automatically picks up the new credentials on the next job run without any changes to the connector configuration in Prizm. See the **Use Vault** option in the connection form when setting up authentication.
  </Accordion>
</AccordionGroup>

## Permissions

<AccordionGroup>
  <Accordion title="What is IMPORTED PRIVILEGES and why does Prizm need it?">
    `IMPORTED PRIVILEGES` grants access to the `SNOWFLAKE` shared database, which contains the `ACCOUNT_USAGE` schema. Prizm uses this for:

    * Query performance history (`QUERY_HISTORY`)
    * Warehouse compute metering (`WAREHOUSE_METERING_HISTORY`)
    * Task run history (`TASK_HISTORY`)
    * Snowpipe load history (`COPY_HISTORY`)
    * Enterprise column-level lineage (`CORE.GET_LINEAGE`)
    * Tag references (`TAG_REFERENCES`)

    Without this grant, tag sync, pipeline observability, performance metrics, and Enterprise lineage will all be unavailable.
  </Accordion>

  <Accordion title="What is the minimum permission set if I only want catalog discovery?">
    For catalog-only (no observability, quality, lineage, or performance):

    ```sql theme={null}
    GRANT USAGE ON WAREHOUSE <warehouse_name> TO ROLE PRIZM_ROLE;
    GRANT USAGE ON DATABASE <database_name> TO ROLE PRIZM_ROLE;
    GRANT USAGE ON ALL SCHEMAS IN DATABASE <database_name> TO ROLE PRIZM_ROLE;
    GRANT USAGE ON FUTURE SCHEMAS IN DATABASE <database_name> TO ROLE PRIZM_ROLE;
    ```

    No `SELECT` or `IMPORTED PRIVILEGES` required for metadata-only discovery.
  </Accordion>
</AccordionGroup>

## Scoping & Object Inclusion

<AccordionGroup>
  <Accordion title="Can I exclude specific schemas or tables?">
    Yes. Use the **Include / Exclude** wildcard patterns in the Asset Scope step of the connector wizard. Exclude rules take precedence over include rules when both match the same object. For example:

    * Include: `ANALYTICS_DB.*`
    * Exclude: `ANALYTICS_DB.TEMP_*`
  </Accordion>

  <Accordion title="Why is a table I expect not appearing in Prizm?">
    Check that:

    1. The table's database and schema match your include patterns
    2. The table is not matched by an exclude pattern
    3. `PRIZM_ROLE` has `SELECT` on that table (run `SHOW GRANTS ON TABLE <table_name>`)
    4. The Catalog job has completed at least once since the table was created
  </Accordion>

  <Accordion title="Does Prizm support Iceberg tables?">
    Yes. Iceberg tables are detected via the `IS_ICEBERG` flag in `INFORMATION_SCHEMA.TABLES`. They are cataloged and monitored for freshness and volume. Column-level profiling requires the Iceberg table to be registered in Snowflake with accessible metadata.
  </Accordion>
</AccordionGroup>

## Observability & Freshness

<AccordionGroup>
  <Accordion title="What is the difference between an alert and an issue?">
    An **alert** is an automated signal that a monitored metric or quality check has breached its threshold. Alerts are generated by the observability engine without any human action — they fire when a value falls outside the expected range.

    An **issue** is a validated, actionable problem created from one or more related alerts. Issues are tracked work items that can be assigned, commented on, and resolved. The progression is:

    | Stage           | What it means                                                        |
    | :-------------- | :------------------------------------------------------------------- |
    | **Alert**       | A metric or test breached its threshold                              |
    | **Alert Group** | Related alerts on the same asset are clustered together              |
    | **Issue**       | The group meets priority or correlation criteria and requires action |

    An alert escalates to an issue when one or more of the following is true: the affected asset is marked critical, multiple signal types fire simultaneously on the same dataset (e.g. volume drop + freshness delay + schema change), an SLA or SLO is breached, or an automation rule matches. Issues are the right place to track investigation and remediation; alerts are the raw signals.
  </Accordion>

  <Accordion title="How are anomaly detection thresholds calculated?">
    Prizm uses time-series forecasting models to compute dynamic lower and upper thresholds for each metric automatically. The system:

    * Uses up to **100 recent historical run values** as the lookback window per metric
    * Applies a **Hampel filter** (MAD-based, window 10, 3-sigma) to remove outliers before modeling, so transient spikes do not distort thresholds
    * Selects the forecasting model automatically based on the data's characteristics:

    | Model       | When used                                                           |
    | :---------- | :------------------------------------------------------------------ |
    | **EWMA**    | Low variance (stddev \< 2); narrow, stable band around the mean     |
    | **AutoReg** | Very short series (2–3 points); AR(1) forecast with residual bounds |
    | **Prophet** | Default for higher-variance metrics without seasonal patterns       |
    | **SARIMAX** | 60+ data points with a detected seasonal pattern                    |

    * A new metric spends its first **more than 5 historical collection runs** in **Learning mode**, accumulating a baseline, before alerts begin firing. This threshold counts collection **runs**, not elapsed time — a metric collected hourly reaches the end of Learning mode faster than one collected daily.
    * **Alert priority** (LOW, MEDIUM, HIGH, CRITICAL) is determined by how many standard deviations the current value falls outside the threshold band
    * Thresholds are **recalculated after every run**, so the model continuously adapts to changing patterns over time
  </Accordion>

  <Accordion title="Why does Prizm show a freshness update when I only added a tag?">
    Prizm reads freshness from `INFORMATION_SCHEMA.TABLES.LAST_ALTERED`. Snowflake updates this timestamp on any DDL operation, including tag assignments — even if no row data changed. This is Snowflake platform behaviour and cannot be filtered by Prizm.
  </Accordion>

  <Accordion title="How does Prizm detect schema changes?">
    Schema changes are detected by comparing `LAST_DDL` timestamps between Observability job runs. When a change is detected, Prizm fetches the current column list and diffs it against the stored snapshot. Added, removed, renamed, and type-changed columns are each reported as separate events.
  </Accordion>

  <Accordion title="Why is FRESHNESS showing 'NA' for my table?">
    Freshness is derived from `LAST_ALTERED`. "NA" appears when:

    1. The table has never been altered since Prizm connected (no baseline timestamp)
    2. The Observability job has only run once (needs at least two data points)
    3. The table is a view — views do not track `LAST_ALTERED` in the same way
  </Accordion>
</AccordionGroup>

## Write-Back & Data Safety

<AccordionGroup>
  <Accordion title="Does Prizm write data back to Snowflake?">
    Prizm is read-only by default. The only write-back operation is optional bi-directional tag sync, which uses `ALTER TABLE SET TAG` statements. Enabling it requires the `PRIZM_ROLE` to hold `TAG_ADMIN` privileges and must be explicitly enabled in the connector feature settings.
  </Accordion>

  <Accordion title="Does Prizm store or copy my Snowflake data?">
    No. Prizm reads metadata and statistical aggregates (counts, min/max, means) — it does not copy row-level data. Profile jobs run SQL queries like `SELECT COUNT(*), COUNT(DISTINCT col), MIN(col)...` and store only the aggregate results.
  </Accordion>
</AccordionGroup>

## Editions & Compatibility

<AccordionGroup>
  <Accordion title="What Snowflake editions does Prizm support?">
    Prizm supports all Snowflake editions (Standard, Enterprise, Business Critical, Virtual Private) for catalog, profiling, and observability. Lineage is an Enterprise-and-above feature: it depends on `SNOWFLAKE.CORE.GET_LINEAGE`, which Standard edition does not expose. On a Standard-edition account, the Lineage graph will not populate — there is no query-log-based fallback. Upgrade to Enterprise edition or above to enable table- and column-level lineage.
  </Accordion>

  <Accordion title="Does Prizm support Snowflake on Azure / GCP as well as AWS?">
    Yes. The connector works with all Snowflake deployment clouds. Use the account identifier format appropriate for your cloud: `<account>.<region>.<cloud>` (e.g., `xy12345.east-us-2.azure`).
  </Accordion>

  <Accordion title="Does Prizm support Private Link connectivity for Snowflake?">
    Yes. Prizm supports AWS PrivateLink, Azure Private Link, and GCP Private Service Connect for Snowflake connections. To connect via Private Link, use your Snowflake private endpoint URL as the account identifier when configuring the connector. Contact your Prizm platform administrator to confirm that the deployment is configured to route traffic through your organization's private network.
  </Accordion>
</AccordionGroup>

## Connector Lifecycle

<AccordionGroup>
  <Accordion title="What happens if I delete a connector?">
    Deleting a source triggers an approval workflow based on your organization's settings. Once approved, the source and all associated metadata are permanently deleted. The deletion cannot be undone after approval.
  </Accordion>

  <Accordion title="What happens to existing data and alerts if a connector is paused or disconnected?">
    Existing metadata, quality scores, and alerts are retained while the connector is inactive. No new data is collected until the connector is re-enabled. If the connector is permanently deleted (after approval), all associated data is removed.
  </Accordion>

  <Accordion title="How does manual re-sync work alongside scheduled jobs?">
    The platform supports both manual and scheduled refresh/re-sync operations. Triggering a manual scan runs the job immediately without affecting the configured schedule. Schedules for core job types (technical, operational, governance, performance, usage summary, compute metric) are created automatically when a source is configured. Custom metric schedules can be created manually. Any schedule update overrides the existing schedule and applies to all future executions.
  </Accordion>

  <Accordion title="How long does Prizm retain historical data?">
    The default data retention window for time-series observability data, quality score history, and query usage history is **90 days**.
  </Accordion>
</AccordionGroup>

<CardGroup cols={2}>
  <Card title="Troubleshooting" icon="plug" href="/help/troubleshooting">
    For connection errors, permission issues, and performance problems.
  </Card>

  <Card title="Glossary" icon="circle-question" href="/help/glossary">
    For definitions of terms used in this FAQ.
  </Card>
</CardGroup>
