{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/dataverse-auditoria-change-tracking-conformidade/","result":{"data":{"markdownRemark":{"frontmatter":{"title":"Dataverse: auditoria e change tracking para conformidade","description":"Como configurar auditoria e change tracking no Dataverse sem inflar o storage: escopos, retenção, custo, sincronização incremental e boas práticas de governança.","date":"21 de setembro de 2026","thumbnail":null},"html":"<p>Registrar quem alterou o quê e quando parece um detalhe de configuração, mas em ambientes Dataverse que sustentam Dynamics 365 e apps model-driven críticos, a auditoria vira peça central de conformidade — e, se mal configurada, uma das maiores fontes de consumo de storage e de degradação silenciosa. Vale entender exatamente o que a plataforma grava, quanto custa e como usar change tracking para integrações sem confundir os dois mecanismos.</p>\n<p><strong>Auditoria e change tracking resolvem problemas diferentes</strong></p>\n<p>É comum tratar auditoria (auditing) e change tracking como sinônimos. Eles não são.</p>\n<ul>\n<li><strong>Auditoria</strong> existe para <em>conformidade e forense</em>: registra alterações de dados (create/update/delete), acesso a registros e eventos de administração, com autor, timestamp e valores antigo/novo. Os registros ficam em partições de audit history, consultáveis pela trilha de auditoria no formulário ou via Web API (<code>audit</code> entity), e são imutáveis para o usuário.</li>\n<li><strong>Change tracking</strong> existe para <em>sincronização incremental</em>: permite que um sistema externo pergunte \"o que mudou desde o meu último sync?\" via delta tokens na Web API. Não guarda valor antigo, não é uma trilha de conformidade — é um mecanismo de delta para ETL e integração.</li>\n</ul>\n<p>Usar auditoria como fonte de integração é um antipadrão clássico: infla storage, é caro de consultar e não foi desenhado para isso. Para alimentar um data warehouse ou um Fabric, o caminho é change tracking (ou Synapse Link / Fabric Link, que se apoiam nele).</p>\n<p><strong>A auditoria é hierárquica — e é aí que o storage explode</strong></p>\n<p>A auditoria no Dataverse é habilitada em três níveis, e todos precisam estar ligados para o registro acontecer:</p>\n<ol>\n<li><strong>Environment</strong> — chave-mestra em System Settings (Auditing). Se estiver off, nada é gravado.</li>\n<li><strong>Table (entity)</strong> — cada tabela tem seu flag de auditoria.</li>\n<li><strong>Column</strong> — dentro de uma tabela auditada, cada coluna pode ser incluída ou não.</li>\n</ol>\n<p>O erro mais comum é ligar auditoria no ambiente e marcar tabelas inteiras \"por precaução\", incluindo colunas de alta cardinalidade e alto churn (campos calculados atualizados por rollup, timestamps, campos de status que mudam a cada etapa de workflow). Cada update auditado gera uma linha de audit history com o diff. Em tabelas de alto volume transacional, isso vira gigabytes de log — que consomem a cota de <strong>Dataverse Log storage</strong> (uma das três cotas de capacidade, junto de Database e File) e pesam no custo.</p>\n<p>A disciplina prática: audite <em>o que precisa ser defensável</em> (campos financeiros, de status regulatório, de titularidade/owner, de dados pessoais sob LGPD) e deixe de fora colunas técnicas e ruidosas.</p>\n<p><strong>Retenção não era controlável — agora é</strong></p>\n<p>Historicamente, o audit log crescia indefinidamente e a única forma de limpar era deletar partições inteiras por período, perdendo granularidade. Hoje o Dataverse oferece <strong>políticas de retenção de auditoria</strong> configuráveis (por exemplo, reter por N meses e expirar automaticamente), o que muda a estratégia: em vez de sofrer com storage crescente ou deletes manuais arriscados, define-se uma janela alinhada à exigência regulatória (muitas normas pedem 12, 24 ou 60 meses) e deixa a plataforma expirar o excedente.</p>\n<p>Recomendações ao desenhar retenção:</p>\n<ul>\n<li>Alinhe a janela ao requisito legal real, não a \"o máximo possível\". Reter tudo para sempre é custo puro sem valor de conformidade adicional.</li>\n<li>Se houver exigência de arquivamento além da janela operacional, extraia o audit history periodicamente (Web API sobre a entidade <code>audit</code>) para armazenamento frio antes de expirar.</li>\n<li>Trate a mudança de política como evento de governança — reduzir retenção pode apagar histórico que alguém esperava ter.</li>\n</ul>\n<p><strong>Change tracking sem armadilhas de sincronização</strong></p>\n<p>Do lado da integração, habilitar change tracking numa tabela é simples, mas há detalhes de produção que derrubam pipelines:</p>\n<ul>\n<li><strong>Guarde o delta token, não a data.</strong> O padrão correto é a query inicial retornar um token de deleção/delta; a próxima chamada usa esse token para trazer só o que mudou. Basear sync em \"registros modificados após timestamp X\" é frágil (fusos, relógios, updates concorrentes) — o token existe justamente para eliminar isso.</li>\n<li><strong>Deletes aparecem como tombstones.</strong> Change tracking informa registros deletados, mas essa informação também expira. Se o consumidor ficar offline além da janela de retenção do change tracking, o token fica inválido e é preciso um <em>full sync</em> de reconciliação. Planeje esse fallback.</li>\n<li><strong>Não confunda com auditoria para reconstruir estado.</strong> Change tracking te dá o estado atual do que mudou, não o valor anterior. Se a integração precisa do \"de/para\", isso é responsabilidade do destino (armazenar histórico) ou da auditoria — não do delta token.</li>\n</ul>\n<p>Para cargas em escala rumo a analytics, prefira <strong>Synapse Link for Dataverse</strong> ou o <strong>link com Microsoft Fabric</strong>, que gerenciam o change tracking por baixo e entregam os dados em Delta/Parquet no OneLake, evitando construir e manter o loop de delta token manualmente.</p>\n<p><strong>Um roteiro enxuto de decisão</strong></p>\n<ol>\n<li>Precisa provar <em>quem mudou o quê</em> para auditor/regulador? → Auditoria, restrita às colunas defensáveis, com política de retenção alinhada à norma.</li>\n<li>Precisa <em>replicar dados que mudaram</em> para um sistema externo ou warehouse? → Change tracking (ou Synapse/Fabric Link por cima dele), nunca auditoria.</li>\n<li>Precisa das duas coisas? → Ative os dois de forma independente e monitore separadamente o Log storage (auditoria) e a saúde dos tokens (integração).</li>\n<li>Storage crescendo? → Revise colunas auditadas de alto churn antes de comprar mais capacidade.</li>\n</ol>\n<p>Governar auditoria e change tracking no Dataverse é menos sobre ligar interruptores e mais sobre desenhar <em>o mínimo necessário</em> para conformidade e integração, com custo previsível. Se sua empresa opera Dynamics 365 ou apps model-driven em escala e precisa de uma trilha de auditoria que aguente auditor externo sem estourar a cota de storage, a Dynamic Soluções ajuda a desenhar essa estratégia de governança de ponta a ponta — do escopo de colunas à retenção e à arquitetura de sincronização.</p>\n<p>Recording who changed what and when looks like a configuration detail, but in Dataverse environments backing Dynamics 365 and critical model-driven apps, auditing becomes a core piece of compliance — and, if poorly configured, one of the biggest sources of storage consumption and silent degradation. It's worth understanding exactly what the platform records, what it costs, and how to use change tracking for integrations without conflating the two mechanisms.</p>\n<p><strong>Auditing and change tracking solve different problems</strong></p>\n<p>It's common to treat auditing and change tracking as synonyms. They aren't.</p>\n<ul>\n<li><strong>Auditing</strong> exists for <em>compliance and forensics</em>: it records data changes (create/update/delete), record access, and admin events, with author, timestamp, and old/new values. The records live in audit history partitions, queryable through the audit trail on the form or via Web API (the <code>audit</code> entity), and are immutable to the user.</li>\n<li><strong>Change tracking</strong> exists for <em>incremental synchronization</em>: it lets an external system ask \"what changed since my last sync?\" via delta tokens in the Web API. It doesn't keep the old value, it isn't a compliance trail — it's a delta mechanism for ETL and integration.</li>\n</ul>\n<p>Using auditing as an integration source is a classic antipattern: it inflates storage, is expensive to query, and wasn't designed for it. To feed a data warehouse or Fabric, the right path is change tracking (or Synapse Link / Fabric Link, which rely on it).</p>\n<p><strong>Auditing is hierarchical — and that's where storage explodes</strong></p>\n<p>Auditing in Dataverse is enabled at three levels, and all of them must be on for a record to be written:</p>\n<ol>\n<li><strong>Environment</strong> — the master switch in System Settings (Auditing). If it's off, nothing is recorded.</li>\n<li><strong>Table (entity)</strong> — each table has its own auditing flag.</li>\n<li><strong>Column</strong> — within an audited table, each column can be included or not.</li>\n</ol>\n<p>The most common mistake is enabling environment auditing and marking whole tables \"just in case,\" including high-cardinality, high-churn columns (calculated fields refreshed by rollups, timestamps, status fields that change at every workflow step). Each audited update generates an audit history row with the diff. In high-volume transactional tables, this turns into gigabytes of log — consuming the <strong>Dataverse Log storage</strong> quota (one of the three capacity quotas, alongside Database and File) and driving up cost.</p>\n<p>The practical discipline: audit <em>what needs to be defensible</em> (financial fields, regulatory status, ownership, personal data under privacy laws) and leave out technical, noisy columns.</p>\n<p><strong>Retention wasn't controllable — now it is</strong></p>\n<p>Historically, the audit log grew indefinitely and the only way to clean it was deleting entire partitions by period, losing granularity. Today Dataverse offers configurable <strong>audit retention policies</strong> (for example, retain for N months and expire automatically), which changes the strategy: instead of suffering from ever-growing storage or risky manual deletes, you define a window aligned with the regulatory requirement (many rules ask for 12, 24, or 60 months) and let the platform expire the excess.</p>\n<p>Recommendations when designing retention:</p>\n<ul>\n<li>Align the window to the real legal requirement, not to \"as much as possible.\" Keeping everything forever is pure cost with no added compliance value.</li>\n<li>If there's an archival requirement beyond the operational window, extract audit history periodically (Web API over the <code>audit</code> entity) to cold storage before it expires.</li>\n<li>Treat policy changes as a governance event — reducing retention can erase history someone expected to have.</li>\n</ul>\n<p><strong>Change tracking without sync pitfalls</strong></p>\n<p>On the integration side, enabling change tracking on a table is simple, but there are production details that break pipelines:</p>\n<ul>\n<li><strong>Store the delta token, not the date.</strong> The correct pattern is that the initial query returns a delta/deletion token; the next call uses that token to fetch only what changed. Basing sync on \"records modified after timestamp X\" is fragile (time zones, clocks, concurrent updates) — the token exists precisely to eliminate that.</li>\n<li><strong>Deletes show up as tombstones.</strong> Change tracking reports deleted records, but that information also expires. If the consumer stays offline beyond the change tracking retention window, the token becomes invalid and a reconciling <em>full sync</em> is required. Plan for that fallback.</li>\n<li><strong>Don't confuse it with auditing to reconstruct state.</strong> Change tracking gives you the current state of what changed, not the previous value. If the integration needs the \"from/to,\" that's the destination's responsibility (store history) or auditing's — not the delta token's.</li>\n</ul>\n<p>For at-scale loads toward analytics, prefer <strong>Synapse Link for Dataverse</strong> or the <strong>Microsoft Fabric link</strong>, which manage change tracking under the hood and deliver the data as Delta/Parquet in OneLake, avoiding building and maintaining the delta token loop yourself.</p>\n<p><strong>A lean decision guide</strong></p>\n<ol>\n<li>Need to prove <em>who changed what</em> to an auditor/regulator? → Auditing, restricted to defensible columns, with a retention policy aligned to the regulation.</li>\n<li>Need to <em>replicate changed data</em> to an external system or warehouse? → Change tracking (or Synapse/Fabric Link on top of it), never auditing.</li>\n<li>Need both? → Enable them independently and monitor Log storage (auditing) and token health (integration) separately.</li>\n<li>Storage growing? → Review audited high-churn columns before buying more capacity.</li>\n</ol>\n<p>Governing auditing and change tracking in Dataverse is less about flipping switches and more about designing <em>the minimum necessary</em> for compliance and integration, with predictable cost. If your company runs Dynamics 365 or model-driven apps at scale and needs an audit trail that withstands an external auditor without blowing the storage quota, Dynamic Soluções helps design this governance strategy end to end — from column scope to retention and sync architecture.</p>"}},"pageContext":{"slug":"/blog/dataverse-auditoria-change-tracking-conformidade/","previousPost":null,"nextPost":{"frontmatter":{"title":"Power Automate: paginação e throttling em APIs REST de alto volume"},"fields":{"slug":"/blog/power-automate-paginacao-throttling-apis-rest-alto-volume/"}}}},"staticQueryHashes":["2269431855"]}