Skip to main content
Data Governance

Your data warehouse is a compliance artifact now

You built it to answer business questions. It is now being asked to answer control questions, by a customer's security team, a regulator, a model risk reviewer, or a prime contractor's flow-down clause. Those are different questions, and the platform that answers the first well often cannot answer the second at all.

The moment the warehouse changes jobs

There is usually a specific week when it happens. A federal prime sends a subcontract with DFARS 252.204-7012 attached and asks where the technical data lands. A bank's model risk group asks, under SR 11-7, for the derivation of an input feature your ratings product ships. A hospital customer's privacy office asks who queried a table last March. A large buyer sends a 240-question security questionnaire and about forty of the questions are about the analytics platform. Nothing in the warehouse broke. Its job changed.

Analytics platforms are optimized for a set of properties that have nothing to do with what a reviewer wants. Fast reads, wide permissions so analysts are not blocked, generous retention because storage is cheap, and a culture of copying a table to answer a question quickly. Every one of those is a virtue when the goal is answering business questions and a finding when the goal is demonstrating control. The gap is not usually a security gap. It is an evidence gap.

The distinction matters because it sizes the project. Poor access control is a rebuild. Reasonable access control with no way to prove it for a past period is an instrumentation project measured in weeks. Most companies we look at are in the second category and assume they are in the first, so they overbuy a governance platform or delay until a deal is at risk.

You are probably here because

  • A customer questionnaire asked who has access to a schema and the honest answer is "most of engineering"
  • Someone asked for the derivation of one number and it took a week and three people
  • A contract arrived with a data-protection clause and nobody knows which tables it touches
  • You cannot produce, for a date six months ago, the list of people who could read a given table

The first is a boundary problem, the second is lineage, the third is classification, and the fourth is the one that decides whether this is a documentation exercise or an engineering project.

Four regimes, one platform, different questions

The frameworks that arrive at a commercial data platform are not interchangeable, and treating them as one undifferentiated compliance blob is how budgets get wasted. Each asks a distinct question and each has a different cheapest answer.

NIST SP 800-171, arriving through DFARS flow-down and enforced through CMMC assessment, asks a boundary question: where does controlled unclassified information live, and is that place separated and monitored. Of its 110 requirements in fourteen families, the ones that bind a warehouse are access control, audit and accountability, media protection, and system and communications protection. FedRAMP and NIST SP 800-53 ask the same question with a far larger control set, and apply when you sell a service to an agency rather than handle their data as a subcontractor.

SR 11-7, the Federal Reserve and OCC model risk guidance, asks a derivation question: can you show the data a model consumed, the transformations applied, and that the inputs were checked for quality and fitness for purpose. It applies through your customer even when it does not apply to you, which is why a fifty-person data vendor ends up answering it. ISO 42001 and the NIST AI Risk Management Framework ask a governance question: is there a management system around the AI work, with defined roles, documented decisions and evidence they were followed. None of the four asks whether your dashboards are fast.

Where the work actually lands — our effort split across warehouse compliance engagements

Classifying data and drawing the boundary
26
Access model rebuild: roles, grants, review cycle
23
Lineage capture and reproducible derivations
19
Audit log retention, integrity and query tooling
14
Retention and deletion that actually executes
11
Writing the policy documents themselves
7

Relative weights from what we find when preparing an existing commercial platform for review. Your mix will differ; the bottom row is always smallest, and it is the row most vendors sell first.

Classification is the whole project in disguise

Nobody wants to start here because it feels like paperwork. It is the load-bearing step, because every downstream control depends on knowing which tables are in scope. A boundary drawn around the whole warehouse means every control applies to every table, which is expensive and usually fails. A boundary drawn around forty tables is defensible and affordable, provided you can show those forty are the right forty.

The mechanism that works is column-level tagging enforced at write time rather than a spreadsheet inventory maintained by hand. Every modern platform has the primitive: Snowflake object tags with masking policies attached, BigQuery policy tags backed by Data Catalog taxonomies, Databricks Unity Catalog tags with column masks, and plain column comments plus a check in the transformation layer if you are on Postgres. The rule to enforce in CI is that a new column in a governed schema fails the build until it carries a classification tag. That single check is the difference between an inventory that is accurate on the day it is written and one that stays accurate.

Then find the copies, because copies are where the boundary leaks. A governed table gets copied into a personal scratch schema, extracted to a CSV for a partner, cached in a BI tool's own storage, or pulled into a notebook that writes to object storage outside the governed prefix. We have never run a boundary exercise that found none of these. Query history is the tool: read six months of it, find every statement that selected from a governed table and wrote somewhere else, and you have the real map.

The architecture diagram shows the boundary you designed. Six months of query history shows the boundary you have. The second one is the one a reviewer will find.

Access control that survives a question about last March

Most warehouses fail here in a specific and fixable way. Permissions were granted to individuals, over years, by people who have since left, in response to urgent requests that were correct at the time. The current state is knowable with a query. The state on an arbitrary past date is not, and that is what the reviewer asks for.

Three changes fix it. Grant to roles, never to people, so the membership list is the only thing that changes and the grant graph stays small enough to reason about. Provision role membership from your identity provider through SCIM, so a departure in the HR system removes warehouse access without anyone remembering to do it. And snapshot the effective permission set on a schedule, daily is plenty, into a table you keep. That last one costs an afternoon and answers the question that otherwise costs a week, because grant tables in every warehouse show current state only.

Then add the review cycle, which 800-171 and every customer questionnaire ask about by name. Quarterly, generate who can read what, route it to each governed schema's owner, and record the approval with a date and a name. The failure mode is a rubber stamp, because nobody reads four hundred rows of grants. Present the delta instead: what changed since last quarter, and which accounts have not run a query in ninety days. A reviewer who sees fifteen rows actually reads them.

Audit logs are not the same as a log of who saw the data

Every warehouse writes query history, and teams assume that covers the audit requirement. It usually does not, for two reasons that are both about retention and one that is about content.

Retention first. Snowflake's ACCOUNT_USAGE query history holds a year but the faster INFORMATION_SCHEMA views hold seven days. BigQuery's Cloud Audit Logs default to a retention period measured in months in the _Default bucket unless you configure otherwise. Databricks system tables have their own retention. Meanwhile the contract you signed or the framework you are under likely wants three years, and 800-171's audit family expects you to have defined the period deliberately rather than inherited it. The fix is a scheduled export to object storage with lifecycle rules and versioning enabled, which is a day of work and is the single highest-value thing on this list relative to its cost.

Content second. Query text proves a statement ran. It does not say which rows came back, and a privacy reviewer wants to know whose records were exposed. For high-sensitivity tables the practical answer is a view layer requiring a purpose parameter logged alongside the query, so the record shows not just that an analyst read the patient table but why. That is only heavy if you apply it everywhere. Apply it to the four tables that matter.

Default audit retention before you change anything — days of history available

Exported to object storage with lifecycle rules
1095
Snowflake ACCOUNT_USAGE query history
365
Cloud audit logs in a default log bucket
180
Warehouse system tables, common configuration
90
INFORMATION_SCHEMA views, the fast ones people query
7

Illustrative of the order-of-magnitude spread between platform defaults and a review period. Check your own tenant; several of these are configurable and none should be inherited by accident.

Reproducing a number from eighteen months ago

This is the question that separates platforms that pass review from platforms that do not, and it comes in the same form every time. Here is a figure we published in Q1 of last year. Reproduce it. Not approximately. Exactly.

Three things have to be true simultaneously. The input data as it stood at that moment must be recoverable, which means time travel with a retention window long enough to matter, or immutable snapshots, or a table format like Iceberg or Delta whose history you have not vacuumed away. The transformation code must be identifiable by version, which means the run recorded a git commit rather than merely a timestamp. And the run parameters must be recorded, because a job that filtered on now() instead of an explicit interval cannot be reproduced even with perfect code and perfect data.

Note the cost trap in the first one. Snowflake time travel is one day on standard edition and configurable to ninety on enterprise, and the storage bill for ninety days of a large mutable table surprises people. Iceberg and Delta snapshot retention has the same shape. The right move is per-table: long retention on the twenty tables that feed reported figures, short retention on everything else. A blanket ninety-day setting across a petabyte is how a governance project gets cancelled by finance. We have covered the mechanics of proving a derivation in more depth in data lineage that satisfies an auditor.

What is asked forWhat has to existTypical effortWhat it costs to skip
Which tables are in scopeColumn-level tags enforced at write time, plus a copy map from query history3 to 6 weeksEvery control applies to everything; scope inflates three to five times
Who could read this in MarchRole-based grants, SCIM provisioning, daily permission snapshots4 to 8 weeksA week of manual reconstruction per question, and it is still an estimate
Who did read itAudit log export to immutable storage, retention set deliberately, queryable1 to 2 weeksThe window closes at 7 to 365 days and the evidence is simply gone
Reproduce this figureSnapshot retention on reported tables, code version and parameters per run4 to 10 weeksThe answer becomes "close enough," which is not an answer
Prove deletion happenedExecuted retention jobs with a per-run record of what was removed2 to 4 weeksA written policy with no execution evidence, which reads worse than none

The retention policy nobody runs

Almost every company has a written retention schedule. Far fewer have a job that enforces it, and the gap is worse than having no policy at all, because the policy is a documented commitment and the absence of deletion evidence is a documented failure to meet it. A reviewer who finds a policy saying ninety days and a table holding four years has found something specific.

Make deletion a pipeline like any other. It runs on a schedule, it is parameterized, it logs what it removed and how many rows, and its output is a record you can hand over. Then handle the three places deletion quietly does not reach: soft deletes that only set a flag, time travel and snapshot history that still holds the deleted rows for the retention window, and backups. The backup one is genuinely hard and the honest engineering answer is usually crypto-shredding, where a per-tenant or per-subject key is destroyed so the ciphertext in backups becomes unrecoverable. State the approach explicitly rather than letting a reviewer discover the gap.

A retention policy with no execution record is a written promise you cannot show you kept. Deletion has to be a job with a log, not a paragraph in a document.

What this costs and how long it takes

For a commercial platform of ordinary size, a few hundred tables and thirty to a hundred people with some form of access, the sequence takes four to seven months of concentrated work and lands somewhere between $180,000 and $450,000 in engineering time. The spread is driven almost entirely by two things: how much of the data was copied out of the platform into places nobody tracks, and whether the transformation layer is version-controlled or is a collection of stored procedures and scheduled queries edited in a console.

The second is the expensive variable. A team on dbt or a similar framework with everything in git already holds half the reproducibility answer and did not build it for compliance. A team whose logic lives in a console has to get it into version control first, a real project that pays for itself independently of any framework. Tooling is the smaller line: governance platforms quote $60,000 to $200,000 a year and earn it once classification is done, close to nothing before, because they inventory whatever you point them at without deciding what matters. Buy the platform after you know your boundary, not to discover it.

The sequence that does not waste money

Order matters here more than in most engineering work, because each step makes the next one cheaper. Classify first, because scope determines everything downstream. Fix access second, because it is the most commonly asked question and the permission snapshot starts accumulating history the day you turn it on, and history cannot be created retroactively. Export audit logs third, for the same reason and at a fraction of the cost. Then lineage and reproducibility, which is the largest single piece. Then retention execution. Then the documents, written from what the system actually does.

The common failure is running that list backwards. A consultant writes the policies, the policies describe controls the platform does not implement, and the organization now has documentation that a reviewer can use as a checklist of things to find missing. Write the document last, describing the system as built. That is slower to start and much faster to finish.

What good looks like from the other side of the table

The companies that pass these reviews cleanly are not the ones with the most controls. They are the ones that can answer a question in an hour instead of a week, and that state their gaps before anyone finds them. A firm that says column-level lineage covers 84 percent of the paths feeding reported figures, the remaining 16 percent is these four named systems, and here is the handling for each, is far more credible than one presenting a clean picture with silent holes in it. The first invites a specific conversation. The second collapses the moment somebody finds a hole, and takes the rest of the work down with it.

None of this means the warehouse was built wrong. It was built correctly for the job it had, and the job changed. Done in the right order these are also the changes that make the platform easier to operate: fewer standing permissions, deletions that run, numbers you can rebuild. The compliance requirement is only the thing that finally funds them.

Bottom line

Your analytics platform is now evidence, and evidence has properties that dashboards do not. Know which tables are in scope and enforce that at write time. Grant to roles and snapshot the permission set daily, because past state cannot be reconstructed later. Export audit logs somewhere immutable before the default retention window closes. Make reported figures reproducible by pinning data, code version and parameters together. Run deletion as a logged job. Do those five and the questionnaire, the model risk review and the flow-down clause all get answered out of the same instrumentation, which is the only reason the work is affordable at all.

Frequently asked questions

Does 800-171 apply to our data warehouse if we are a subcontractor?

It applies to the systems that process, store or transmit controlled unclassified information received under the contract. If CUI reaches the warehouse, the warehouse is in scope. The usual and much cheaper answer is to keep CUI out of the general analytics platform entirely and give it a separate, smaller enclave.

Our customer is a bank asking about SR 11-7. That is their regulation, not ours.

Correct, and it reaches you through the contract anyway. The bank has to evidence the data feeding its models, and if your product is an input then their evidence includes your derivations, your data quality checks and your change control. Vendors that can hand over lineage and a versioned methodology close these reviews in weeks rather than quarters.

Should we buy a data governance platform first?

After classification, not before. These tools inventory what you point them at and apply the policies you define; neither substitutes for deciding which data matters and where the boundary sits. Bought first, a governance platform produces a large catalogue nobody trusts.

How far back do we need to keep audit logs?

Long enough to cover the review period you will face, which is commonly one to three years, and longer where a contract says so. The important part is that the period is chosen and documented rather than inherited from a platform default, several of which are seven days.

Can we do this without slowing the analytics team down?

Mostly, if the controls are enforced at write time in the pipeline rather than as approval steps in front of analysts. Tagging in CI, roles instead of individual grants, and automatic log export are invisible day to day. The parts people feel are purpose-logged access on the few highest-sensitivity tables and the quarterly access review, both of which can be kept small.

1 business day response

Can you show who could read a given table six months ago?

Send the questionnaire or the clause you are answering, a list of your governed schemas, and how your transformation logic is versioned. Our engineers come back with what is already provable, what is missing, and the order to fix it in.

Email an engineerCapabilitiesMore insights → or email bo@precisionfederal.com
UEI Y2JVCZXT9HP5CAGE 1AYQ0NAICS 541512SAM.GOV ACTIVE