SQL Server: Temporal Tables - armazenando dados históricos

Este artigo apresenta o novo recurso do SQL Server, Temporal Tables, que permite o armazenamento de dados históricos.

SQL Server Temp Table

Temporal Tables, também conhecida como System-Versioned, é a nova feature incluída no SQL Server 2016 para armazenamento de dados históricos. Todas as alterações realizadas pelos usuários na tabela atual são armazenadas de maneira simples e prática em outra tabela com a finalidade de manter o versionamento das informações. Temporal Tables podem ser utilizadas em diversos cenários, dentre os quais podemos destacar a auditoria de dados, onde é possível realizar uma análise detalhada em um determinado período no tempo, recuperação de dados excluídos ou modificados acidentalmente pelo usuário e versionamento de dados em um ambiente de Data Warehouse (ETL).

Armazenar informações atuais e históricas é um processo relevante dentro do mundo corporativo, pois permitem uma análise mais detalhada dos acontecimentos ao longo do tempo. Este artigo tem a finalidade de mostrar como funciona a nova feature denominada Temporal Tables, suas principais características, limitações e exemplos práticos que podem auxiliar o DBA e desenvolvedores na análise de dados.

Temporal Tables é um novo tipo de tabela de usuário e está disponível em todas as versões do SQL Server 2016. Sua finalidade é manter o histórico completo de alterações de dados em tabelas específicas, permitindo uma análise e acompanhamento dos dados ao longo do tempo. É conhecida também como system-versioned, pois o período de validade de cada linha é gerenciado pelo mecanismo de banco de dados.

Temporal Tables é recurso nativo do SQL Server 2016 e não requer qualquer configuração adicional na instância ou no banco de dados. A implementação é realizada através de duas tabelas: uma para manter os dados atuais e outra para armazenar as modificações na tabela histórica. Durante a criação da estrutura da tabela, obrigatoriamente temos que especificar uma chave primária (Primary Key) e as colunas de início e fim do período com o tipo de dados datetime2 para que seja possível manter o versionamento e a validade de cada linha, além de uma cláusula adicional para habilitar a funcionalidade. Uma vez habilitada, o gerenciamento é feito pelo próprio SQL Server.

Quando um usuário de aplicação realiza qualquer modificação na tabela que armazena os dados atuais, automaticamente a versão anterior da linha é gravada na tabela histórica para futuras consultas, conforme podemos observar na Figura 1.

Figura 1. Como funciona a Temporal Table

Alguns pré-requisitos devem ser atendidos para que seja possível utilizar a Temporal Tables:

  • a tabela atual deve conter a chave primária (PK);
  • uma coluna com o tipo de dados DATETIME2 e com a cláusula GENERATED ALWAYS AS ROW START para identificar a data de início da validade do registro;
  • uma coluna com o tipo de dados DATETIME2 e com a cláusula GENERATED ALWAYS AS ROW END para identificar a data de término da validade do registro;
  • a tabela deverá ser especificada com a cláusula SYSTEM_VERSIONING igual a ON para permitir a utilização da tabela histórica.

Cenários recomendados

Alguns cenários são recomendados para o uso de Temporal Tables, o que pode trazer benefícios e agilidade para as atividades desenvolvidas na empresa:

  • Auditoria sobre os dados modificados na tabela através de análises minuciosas e detalhadas de diversos períodos ao longo do tempo;
  • Recuperação de dados que foram modificados ou excluídos acidentalmente pelo usuário sem a necessidade de restauração de backups, que dependendo do ambiente e tamanho da base de dados, pode ser um processo demorado até que o objetivo seja alcançado;
  • Auxiliar o versionamento de dados em um ambiente de Data Warehouse (ETL).

Existem algumas limitações e restrições em Temporal Tables quando SYSTEM_VERSIONING estiver ON:

  • Tabela atual e histórica:
    • Não é possível utilizar os comandos DDL para exclusão, adição ou exclusão de colunas;
    • Não é possível utilizar FILETABLE e FILESTREAM;
    • Excluir os dados através do comando TRUNCATE TABLE não é permitido;
    • Linked Server não é suportado nas consultas aos dados de Temporal Tables.
  • Somente tabela histórica:
    • Não é possível a utilização de constraints (Primary Key, Foreign Keys, Default, etc.);
    • Dados históricos não podem ser modificados;" [...] continue lendo...

Artigos relacionados