Scope
- Platform: Snowflake
- Scope: account xy12345, database CANOT_LAB
- Privilege level: 3 (+ privileges and tools (pseudonymized))
- SQL mode: read-only
- Reads: 33 done out of 35
- Content read: 12 tables, 25 objects, 6 query families
- Versions: canot X, duckdb X, sqlglot X
Capabilities
This report is an inventory: inventoried, neither exported nor replayed.
| Level | This report | Canot on Snowflake |
|---|---|---|
| Inventory | done by this scan (level 3) | full, levels 1 to 3 |
| Export | not done by this scan | iceberg, with canot drill |
| Evidence | not done by this scan | P1 data parity; P2 query replay, with canot drill |
Snowflake connector: tested; recorded test: canot drill, 2026-10-17: Snowflake trial account, TPC-H SF10 (docs/banc-essai.md).
What Canot cannot prove here: the declared forms (P1, P2) cover tables and queries; objects to rebuild besides tables are counted, not proven.
Observed costs
Window: 365 days. Credits measured; in dollars, only with the price provided or a dated list-price range.
| Item | Value | Nature and basis |
|---|---|---|
| Credits consumed | 43.50 credits | computed · S05 sum of credits per service over 365 days |
| In dollars | $113.10 to $226.20
| estimated, low confidence · S05 credits × list price of the credit, from lowest to highest |
Per service
| Service | Credits |
|---|---|
| WAREHOUSE_METERING | 41.50 credits |
| SERVERLESS_TASK | 1.20 credits |
| AUTO_CLUSTERING | 0.80 credits |
Per warehouse
| Warehouse | Credits |
|---|---|
| CANOT_WH | 40.00 credits |
| COMPUTE_WH | 1.50 credits |
Storage
| Item | Value | Nature and basis |
|---|---|---|
| Average billed storage | 24 GB | measured · S04 |
| Storage in dollars | Not estimated: your contract price not read. | not estimated |
Movements
3 frozen, 7 live, 1 recreated, 1 not determined.
recreated: DDL less than 7 days old with no later write; live: write less than 30 days old; frozen: older last write; not determined: writes not read. Based on: S01, S08, S25.
| Table | Type | Volume | Movement | Evidence |
|---|---|---|---|---|
| CANOT_LAB.RAW.ARCHIVE_1 | TABLE | 5 GB | frozen | last write on 2025-01-10 |
| CANOT_LAB.RAW.ARCHIVE_2 | TABLE | 5 GB | frozen | last write on 2025-01-10 |
| CANOT_LAB.RAW.ARCHIVE_3 | TABLE | 5 GB | frozen | last write on 2025-01-10 |
| CANOT_LAB.RAW.ORDERS | TABLE | 2 GB | live | last write on 2026-10-16 |
| CANOT_LAB.MART.FCT_ORDERS | TABLE | 1.5 GB | recreated | last DDL on 2026-10-17, no later write |
| CANOT_LAB.RAW.CUSTOMERS | TABLE | 800 MB | live | last write on 2026-10-15 |
| CANOT_LAB.RAW.ORDERS_CLONE | CLONE | 100 MB | live | last write on 2026-10-15 |
| CANOT_LAB.MART.DIM_LEGACY | TABLE | 10 MB | not determined | writes not read |
| CANOT_LAB.OPS.EVENTS_LOG | TABLE | 10 MB | live | last write on 2026-10-17 |
| CANOT_LAB.SANDBOX.OLD_EXPORT_2023 | TABLE | 10 MB | live | last write on 2026-10-15 |
| CANOT_LAB.SANDBOX.TEAM_WORK | TABLE | 10 MB | live | last write on 2026-10-15 |
| CANOT_LAB.EXT.US_STATES | EXTERNAL | not read | live | last write on 2026-10-15 |
What does not leave with the copy
Objects to rebuild or describe
| Type | Count | Examples |
|---|---|---|
| imported database | 2 | SNOWFLAKE, SNOWFLAKE_SAMPLE_DATA |
| tag | 1 | CANOT_LAB.OPS.PII |
| stream | 1 | CANOT_LAB.OPS.ORDERS_STREAM |
| function | 3 | CANOT_LAB.MART.CLEAN_NAME, CANOT_LAB.MART.FX_TO_CENTS, CANOT_LAB.MART.SLUG |
| share | 2 | S_CLIENTS, S_PARTNER |
| pipe | 1 | CANOT_LAB.OPS.P_EVENTS |
| row access policy | 1 | CANOT_LAB.OPS.RAP_COUNTRY |
| masking policy | 1 | CANOT_LAB.OPS.MP_EMAIL |
| procedure | 3 | CANOT_LAB.MART.SP_DYNAMIC_JS, CANOT_LAB.MART.SP_DYNAMIC_PY, CANOT_LAB.MART.SP_REFRESH_MART |
| stage | 2 | CANOT_LAB.EXT.S3_PUBLIC, CANOT_LAB.RAW.INT_STAGE |
| dynamic table | 1 | CANOT_LAB.MART.DT_COUNTRY_REVENUE |
| task | 4 | CANOT_LAB.OPS.T_DAILY, CANOT_LAB.OPS.T_EXPORT_NIGHTLY, CANOT_LAB.OPS.T_REFRESH, CANOT_LAB.OPS.T_SERVERLESS |
| view | 3 | CANOT_LAB.MART.V_KPI, CANOT_LAB.STAGING.STG_ORDERS, CANOT_LAB.STG.V_STATES |
Routines per language: JAVASCRIPT 2, PYTHON 2, SQL 2.
Columns with a platform-specific type (2)
| Table | Column | Type |
|---|---|---|
| CANOT_LAB.RAW.CUSTOMERS | profile | VARIANT |
| CANOT_LAB.RAW.CUSTOMERS | geo | GEOGRAPHY |
Billed history
| Item | Value | Nature and basis |
|---|---|---|
| Time Travel and Fail-safe (2 tables) | 6.3 GB | computed · S03 Time Travel + Fail-safe of present tables, + bytes still billed for dropped tables |
Dependencies
External dependencies (F01)
| Object | Type | Location |
|---|---|---|
| CANOT_LAB.EXT.S3_PUBLIC | stage | s3://canot-lab-public |
| SNOWFLAKE_SAMPLE_DATA | imported database | not read |
| CANOT_LAB.EXT.US_STATES | table | s3://canot-lab-public |
Hidden external dependencies (F02)
| Object | Path | Location |
|---|---|---|
| CANOT_LAB.MART.V_KPI | CANOT_LAB.MART.V_KPI → CANOT_LAB.STG.V_STATES → CANOT_LAB.EXT.US_STATES | s3://canot-lab-public |
| CANOT_LAB.STG.V_STATES | CANOT_LAB.STG.V_STATES → CANOT_LAB.EXT.US_STATES | s3://canot-lab-public |
Writes outside the platform (F03)
| Source | Mode | Destination |
|---|---|---|
| family 5cf082fb4538 | observed | s3://canot-lab-public |
| object CANOT_LAB.OPS.T_EXPORT_NIGHTLY | declared | s3://canot-lab-export |
External consumers (F09)
| Share | Accounts |
|---|---|
| S_CLIENTS | 2 |
Tools seen in queries
| Tool | Families | Executions |
|---|---|---|
| dbt | 1 | 40 |
| unidentified | 4 | 21 |
| tableau | 1 | 2 |
Connected clients (sessions)
| Client | Sessions |
|---|---|
| dbt-snowflake | 2,190 |
| looker | 310 |
Query replayability
| Category | Meaning | Families | Executions | Weight |
|---|---|---|---|---|
| C0 | translated and accepted by DuckDB | 0 | 0 | 0.00 credits |
| C1 | not parseable | 0 | 0 | 0.00 credits |
| C2 | command, not analyzed | 1 | 1 | 0.00 credits |
| C3 | translation impossible | 0 | 0 | 0.00 credits |
| C4 | DuckDB parse error | 1 | 5 | not read |
| C5 | binding error (platform-specific object or function) | 3 | 54 | 3.00 credits |
| C6 | variable | 0 | 0 | 0.00 credits |
| C7 | DDL, COPY, MERGE, metadata queries: counted separately | 1 | 3 | 0.20 credits |
| Item | Value | Nature and basis |
|---|---|---|
| C0 rate, by families | 0.0% | computed · S24 translated and accepted by DuckDB (C0) / C0 to C6; C7 counted separately |
| C0 rate, by executions | 0.0% | computed · S24 translated and accepted by DuckDB (C0) / C0 to C6; C7 counted separately |
| C0 rate, weighted | 0.0%
| computed · S24 translated and accepted by DuckDB (C0) / C0 to C6; C7 counted separately |
Based on: 0/5 families, window not read, sqlglot X, duckdb X.
accepted ≠ identical result. Translated to DuckDB, not compared.
1 family containing a secret, counted then set aside.
Platform-specific functions
| Function | Families |
|---|---|
| moteur:LAST_QUERY_ID | 1 |
| moteur:MY_UDF | 1 |
| moteur:RESULT_SCAN | 1 |
| stage | 1 |
| tablefromrows | 1 |
Most executed families (normalized forms)
| Category | Executions | Tool | Normalized form |
|---|---|---|---|
| C5 | 40 | dbt | SELECT o.id, o.amount FROM CANOT_LAB.RAW.ORDERS AS o WHERE o.id > ? |
| C5 | 12 | SELECT COUNT(*) FROM CANOT_LAB.RAW.ORDERS WHERE id = ? | |
| C4 | 5 | SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) | |
| C7 | 3 | COPY INTO @CANOT_LAB.EXT.S3_PUBLIC/out/ FROM (SELECT * FROM CANOT_LAB.RAW.ORDERS) | |
| C5 | 2 | tableau | SELECT MY_UDF(id) FROM CANOT_LAB.RAW.ARCHIVE_1 |
| C2 | 1 | EXECUTE |
Ranges
Planning estimates: each range carries its assumptions. A canot drill replaces the assumed throughput with a measurement.
| Item | Value | Nature and basis |
|---|---|---|
| Volume to copy | 19.4 GB
| computed · S03 sum of active bytes |
| Copy read time | 4 min to 16 min
| estimated, low confidence · S03 volume ÷ assumed throughput |
| Copy read credits | 0.07 credits to 0.27 credits
| estimated, low confidence · S03 time × credits per hour |
| Copy read cost | $0.18 to $1.40
| estimated, low confidence · S03 credits × list price of the credit, from lowest to highest |
| Rework | 5.2 d to 31.0 d
| estimated, low confidence · S02, S11, S12, S13, S14, S17 objects × days per object + columns × days per column |
Findings
Each finding is labeled "To review", with no severity level. It states what is observed and what is not.
F01 · External dependencyTo review
3 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.EXT.S3_PUBLIC | External stage (s3://canot-lab-public). |
| object SNOWFLAKE_SAMPLE_DATA | Database imported from an inbound share. |
| table CANOT_LAB.EXT.US_STATES | External table: data outside the platform (s3://canot-lab-public). |
F02 · Hidden external dependencyTo review
2 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.MART.V_KPI | Depends on CANOT_LAB.EXT.US_STATES, outside the platform, through 2 levels: CANOT_LAB.MART.V_KPI → CANOT_LAB.STG.V_STATES → CANOT_LAB.EXT.US_STATES (s3://canot-lab-public). |
| object CANOT_LAB.STG.V_STATES | Depends on CANOT_LAB.EXT.US_STATES, outside the platform, through 1 level: CANOT_LAB.STG.V_STATES → CANOT_LAB.EXT.US_STATES (s3://canot-lab-public). |
F03 · Write outside the platformTo review
2 findings
| Target | Observed |
|---|---|
| family 5cf082fb4538 | Write outside the platform observed: 3 executions; destination: s3://canot-lab-public. |
| object CANOT_LAB.OPS.T_EXPORT_NIGHTLY | Task that writes outside the platform (declared in its definition); destination: s3://canot-lab-export. |
F04 · Owner role with no holderTo review
1 finding
| Target | Observed |
|---|---|
| role LAB_ORPHAN | Role LAB_ORPHAN owns 1 object and is granted to no user, neither directly nor through another role. |
F05 · Storage with no observed readTo review
3 findings
| Target | Observed |
|---|---|
| table CANOT_LAB.RAW.ARCHIVE_1 | 5 GB stored. No read observed in ACCESS_HISTORY from 2025-10-18 to 2026-10-17; blind spots: share consumers, RESULT_SCAN. Shared with 2 external consumers: their reads are not seen. |
| table CANOT_LAB.RAW.ARCHIVE_2 | 5 GB stored. No read observed in ACCESS_HISTORY from 2025-10-18 to 2026-10-17; blind spots: share consumers, RESULT_SCAN. |
| table CANOT_LAB.RAW.ARCHIVE_3 | 5 GB stored. No read observed in ACCESS_HISTORY from 2025-10-18 to 2026-10-17; blind spots: share consumers, RESULT_SCAN. |
F06 · Billed history that does not transferTo review
1 finding
| Target | Observed |
|---|---|
| table CANOT_LAB.RAW.ORDERS | 6 GB of billed history (Time Travel and Fail-safe), retention 30 days, for 2 GB active; this history does not leave with the copy. |
F07 · Dropped table still billedTo review
1 finding
| Target | Observed |
|---|---|
| table CANOT_LAB.RAW.TMP_DROPPED | Dropped on 2026-10-10; 300 MB still billed (Time Travel and Fail-safe). |
F08 · Dynamic SQLTo review
2 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.MART.SP_DYNAMIC_JS | Procedure (JAVASCRIPT): builds SQL at run time; the objects it touches cannot be read from the code. |
| object CANOT_LAB.MART.SP_DYNAMIC_PY | Procedure (PYTHON): builds SQL at run time; the objects it touches cannot be read from the code. |
F09 · External consumersTo review
1 finding
| Target | Observed |
|---|---|
| object S_CLIENTS | Share to 2 target accounts; 2 shared objects. Consumer reads are not seen by this scan. |
F10 · Security to rebuildTo review
5 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.OPS.MP_EMAIL | Masking policy applied to 1 object; it does not leave with the copy; the copy requires an unfiltered principal. |
| object CANOT_LAB.OPS.PII | Tag applied to 1 object; it does not leave with the copy. |
| object CANOT_LAB.OPS.RAP_COUNTRY | Row access policy applied to 1 object; it does not leave with the copy; the copy requires an unfiltered principal. |
| table CANOT_LAB.MART.FCT_ORDERS | Policies: OPS.RAP_COUNTRY. They do not leave with the copy; the copy requires a principal not filtered by these policies. |
| table CANOT_LAB.RAW.CUSTOMERS | Policies: OPS.MP_EMAIL; 1 tag. They do not leave with the copy; the copy requires a principal not filtered by these policies. |
F11 · Scheduled chain and its failuresTo review
7 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.MART.DT_COUNTRY_REVENUE | Dynamic table, schedule 1 day; runs not read. |
| object CANOT_LAB.OPS.ORDERS_STREAM | Stream; on CANOT_LAB.RAW.ORDERS. |
| object CANOT_LAB.OPS.P_EVENTS | Pipe, state RUNNING; runs not read. |
| object CANOT_LAB.OPS.T_DAILY | Task, schedule USING CRON 0 3 * * * Europe/Paris, state started; 365 runs, 2 failures, last on 2026-10-17. |
| object CANOT_LAB.OPS.T_EXPORT_NIGHTLY | Task, schedule USING CRON 0 2 * * * UTC, state started; 30 runs, 30 failures, last on 2026-10-17. |
| object CANOT_LAB.OPS.T_REFRESH | Task, state started; 365 runs, 0 failures, last on 2026-10-17; chain: CANOT_LAB.OPS.T_DAILY → CANOT_LAB.OPS.T_REFRESH. |
| object CANOT_LAB.OPS.T_SERVERLESS | Task, schedule 60 MINUTE, state suspended; 0 runs, 0 failures. |
F12 · Incomplete readTo review
3 findings
| Target | Observed |
|---|---|
| read S33 | STREAMS not read (missing privilege); limits: streams (F11). |
| read S34 | TASK_VERSIONS not read (missing privilege); limits: task versions (F11). |
| read lectures_par_table | Reads not determined for 1 table; limits: storage with no observed read (F05). |
What this report does not quantify
- Storage cost: your contract price not read.
- Your contract rate: your contract price not read.
- Destination storage, running both platforms in parallel, operations after the exit: depend on your contract and your architecture.
- Identical results of translated queries: accepted ≠ identical result: translated to DuckDB, not compared; a canot drill compares the results.
- Cost projections provided by the platform: not used: they cannot be verified from the scan.
Using this report for GDPR, DORA, the Data Act and SecNumCloud
These elements can support your own work on GDPR, DORA, the Data Act or SecNumCloud. They are evidence, not a finding: this report is not a certification, it is not legal advice, and it does not say whether your contracts or your organization meet any regulation.
| Framework | What it asks, in short | What this report gives you | What it does not cover |
|---|---|---|---|
| DORA (Regulation (EU) 2022/2554) | Art. 28(8) and 30(3)(f): a realistic transition, with an adequate period. | Measured throughput and a recovery time range from the exercise; a copy duration range (estimated) in the scan. | Excludes human validation and the cutover of your applications. |
| DORA (Regulation (EU) 2022/2554) | Art. 28: knowing what depends on the ICT provider. | What does not move as is: views, routines, tasks, policies, external dependencies, with the evidence behind each finding. | An inventory of the platform, not of your contracts or of the applications connected to it. |
| Data Act (Regulation (EU) 2023/2854) | Art. 29: switching charges are withdrawn from 12 January 2027. | The effort that remains yours: read cost, copy duration and rework estimates, each marked measured, computed or estimated. | Says nothing about charges your provider may still apply before that date. Prices are dated catalogue figures, not your contract. |
| GDPR (Regulation (EU) 2016/679) | Chapter V (transfers) and Art. 32 (security of processing). | Where the copy is hosted, and which security objects do not move with it (masking and row policies, tags). | The hosting location is the destination you chose. The legal assessment of a transfer is yours. |
| GDPR (Regulation (EU) 2016/679) | Art. 5(1)(c): data minimisation. | The scan reads metadata and execution history, not table contents. SQL text is masked and identities are pseudonymised. | Applies to the scan only: an exit exercise (drill) reads the data it copies. |
References as of 2026-10-19. Check the current texts: they evolve, and their application depends on your situation.
Method
33 reads done out of 35. Each read is recorded with its status and its reason; a value that was not read stays empty, never 0.
| Id | View | Status | Reason | Rows | Window | Latency |
|---|---|---|---|---|---|---|
| S33 | STREAMS | not read | missing privilege; limits: streams (F11) | not read | ||
| S34 | TASK_VERSIONS | not read | missing privilege; limits: task versions (F11) | not read | ||
| S01 | TABLES | read | 10 | 1.5 h | ||
| S02 | COLUMNS | read | 10 | |||
| S03 | TABLE_STORAGE_METRICS | read | 10 | 2 h | ||
| S04 | STORAGE_USAGE | read | 10 | from 2025-10-18 to 2026-10-17 | ||
| S05 | METERING_DAILY_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | 3 h | |
| S06 | WAREHOUSE_METERING_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | 3 h | |
| S07 | QUERY_ATTRIBUTION_HISTORY | read | 10 | |||
| S08 | TABLE_DML_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | 6 h | |
| S09 | TABLE_QUERY_PRUNING_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | 4 h | |
| S10 | OBJECT_DEPENDENCIES | read | 10 | |||
| S11 | VIEWS | read | 10 | |||
| S12 | FUNCTIONS | read | 10 | |||
| S13 | PROCEDURES | read | 10 | |||
| S14 | TASKS | read | 10 | |||
| S15 | TASK_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | ||
| S16 | SERVERLESS_TASK_HISTORY | read | 10 | |||
| S17 | PIPES | read | 10 | |||
| S18 | COPY_HISTORY | read | 10 |
… and 15 more in reads.csv.
Privileges used
Level 3: SNOWFLAKE.OBJECT_VIEWER, SNOWFLAKE.USAGE_VIEWER, SNOWFLAKE.GOVERNANCE_VIEWER, SNOWFLAKE.SECURITY_VIEWER. Never requested: IMPORTED PRIVILEGES, MANAGE GRANTS, IMPORT SHARE, USAGE on functions, READ on stages.
Cost of the scan
| Item | Value | Nature and basis |
|---|---|---|
| Queries sent | 35 queries | measured |
| Read time | 412 s | measured |
Safeguards
- Every SQL statement sent goes through a read-only guard: only SELECT, SHOW, DESCRIBE and ALTER SESSION SET statements go out. No write, no API activation, no parameter change.
- Query users and roles pseudonymized with HMAC, using a salt drawn for this scan and never written; tag values hashed; locations reduced to the bucket.
- Raw SQL text is never written: only normalized forms, with literals masked, leave collection.
Rules
- Movement: recreated: DDL less than 7 days old with no later write; live: write less than 30 days old; frozen: older last write; not determined: writes not read.
- Storage with no read: actual window of the view read, compared with 365 days; the blind spots of each view are listed in the finding.
- Copy time: assumed throughput of 20 to 80 MB/s.
- List prices are dated and sourced; they do not replace your contract price.
Next steps
This report describes your platform; it recommends neither leaving nor staying.
To measure an exit on a chosen scope: canot drill copies to Apache Iceberg, compares source and copy, and signs an evidence report.
To go further, the q4o assessment, from €22,000 excl. VAT: your contract rate, actual execution, scenarios, the steps to follow. canot.io