Encontre aqui dicas de SQL Server para seu dia-a-dia


  • Novidade no SQL Server 2022: A Função DATETRUNC

    O SQL Server 2022 trouxe uma série de novidades muito aguardadas pelos desenvolvedores e DBAs, e uma delas é a nova função DATETRUNC. Essa função simplifica bastante o trabalho com datas, especialmente quando precisamos truncar valores de data/hora para uma parte específica como ano, mês, dia, etc.

    Se você já precisou agrupar dados por mês ou comparar apenas partes de uma data, provavelmente usou funções como DATEADD e DATEDIFF de forma combinada. A boa notícia é que, agora, com DATETRUNC, esse processo ficou muito mais limpo e direto.


    O que é a função DATETRUNC?

    A função DATETRUNC retorna um valor de data/hora truncado para o limite inferior da parte da data especificada (por exemplo: truncar uma data para o início do mês, início do dia, etc).

    Essa função está disponível a partir do SQL Server 2022, e também é compatível com o Banco de Dados SQL do Azure e a Instância Gerenciada de SQL do Azure.


    Sintaxe

    DATETRUNC(date_part, date_expression)
    
    date_part: A parte da data para a qual o valor será truncado.

    date_expression: A expressão de data que será truncada.


    Argumentos Válidos

    Você pode truncar para várias partes da data. Aqui estão algumas opções:

    date_partDescrição
    year, yyyy, yyInício do ano
    quarter, qq, qInício do trimestre
    month, mm, mInício do mês
    day, dd, dInício do dia
    week, wk, wwInício da semana
    hour, hhInício da hora
    minute, mi, nInício do minuto
    second, ss, sInício do segundo
    millisecond, msInício do milissegundo

    Exemplos

    🔹 Truncar para o início do mês

    SELECT DATETRUNC(MONTH, '2025-04-14 13:45:30') AS Truncado;

    Resultado:

    2025-04-01 00:00:00.000

    🔹 Truncar para o início do ano

    SELECT DATETRUNC(YEAR, '2025-04-14 13:45:30') AS Truncado;

    Resultado:

    2025-01-01 00:00:00.000

    🔹 Truncar uma coluna de data

    SELECT DATETRUNC(DAY, OrderDate) AS DiaPedido, COUNT(*) AS TotalPedidos
    FROM Sales.Orders
    GROUP BY DATETRUNC(DAY, OrderDate);

    Esse exemplo é perfeito para agrupar pedidos por dia de forma limpa e direta — sem a necessidade de converter tipos ou manipular strings.


    Comparação com Métodos Antigos

    Antes do SQL Server 2022, você teria que usar combinações de DATEADD e DATEDIFF para fazer algo parecido:

    Truncar para o início do mês (antes do SQL 2022)
    SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, '2025-04-14 13:45:30'), 0);
    
    Com DATETRUNC, essa complexidade desaparece.

    Conclusão

    A função DATETRUNC é uma adição poderosa ao arsenal de qualquer profissional que trabalha com SQL Server. Ela torna o código mais legível, limpo e eficiente, especialmente em operações de agrupamento, análise temporal e relatórios.

    Se você ainda não testou essa novidade, vale a pena experimentar em seus scripts e procedures. Afinal, menos código e mais clareza são sempre bem-vindos!

  • Funções Lógicas GREATEST e LEAST no SQL Server 2022: Comparações Mais Simples e Poderosas

    Com o SQL Server 2022 (versão 16.x), os desenvolvedores e DBAs ganharam dois novos aliados para escrever consultas mais limpas e eficientes: as funções GREATEST e LEAST. Essas funções, comuns em outros SGBDs como Oracle e PostgreSQL, agora estão disponíveis nativamente no SQL Server — e facilitam bastante comparações de múltiplos valores.

    Neste post, você vai entender como essas funções funcionam, ver exemplos práticos e conferir dicas úteis para utilizá-las no seu dia a dia.


    O que são as funções GREATEST e LEAST?

    • GREATEST retorna o maior valor entre dois ou mais argumentos.
    • LEAST retorna o menor valor entre dois ou mais argumentos.

    Ambas funções comparam os argumentos fornecidos e retornam um único valor escalar com base na lógica de comparação padrão do SQL Server.


    Requisitos

    Essas funções estão disponíveis a partir do SQL Server 2022 (16.x) e exigem nível de compatibilidade 160 ou superior.


    Sintaxe

    GREATEST ( expression [ ,...n ] )
    LEAST ( expression [ ,...n ] )
    • expression: Pode ser uma constante, uma coluna, uma variável ou qualquer expressão válida. Deve haver pelo menos dois argumentos.
    • Todos os argumentos devem ser do mesmo tipo de dados ou implicitamente conversíveis.

    Exemplos

    Retornar o maior valor entre três colunas

    SELECT Nome, GREATEST(Nota1, Nota2, Nota3) AS MaiorNota FROM Alunos;

    Retornar o menor valor entre três datas

    SELECT IDPedido, LEAST(DataPedido, DataPagamento, DataEntrega) AS DataMaisAntiga
    FROM Pedidos;

    Casos de Uso Comuns

    • Comparar múltiplos preços de diferentes fornecedores e selecionar o menor (com LEAST).
    • Calcular a maior nota de avaliação entre várias provas (com GREATEST).
    • Verificar qual data veio primeiro em um fluxo de processos.
    • Construir regras de negócio como limites máximos ou mínimos em decisões condicionais (CASE, IF, etc).

    Como era antes do SQL Server 2022?

    Antes, você precisava usar funções CASE para simular esse comportamento:

    -- Simulando GREATEST
    SELECT
    CASE
    WHEN Nota1 >= Nota2 AND Nota1 >= Nota3 THEN Nota1
    WHEN Nota2 >= Nota3 THEN Nota2
    ELSE Nota3
    END AS MaiorNota
    FROM Alunos;

    Esse código era mais difícil de manter. mas com GREATEST e LEAST, esse tipo de lógica se torna muito mais legível e direta.


    Testando no SSMS

    Você pode experimentar a função rapidamente com algo assim:

    SELECT 
    GREATEST(100, 200, 50) AS Maior,
    LEAST(100, 200, 50) AS Menor;

    Resultado:

    MaiorMenor
    20050


    Conclusão

    As funções GREATEST e LEAST vieram para facilitar a vida no SQL Server 2022. Com elas, você escreve menos código, com mais clareza e maior eficiência. Se você ainda está usando CASE para esse tipo de comparação, é hora de dar uma chance a essas novidades.

    Já começou a usar essas funções no seu dia a dia? Compartilhe suas experiências ou dúvidas nos comentários!

  • SQL Server 2022: Gerando Séries de Números no SQL Server 2022 com a Função GENERATE_SERIES

    No SQL Server 2022 (16.x) e versões posteriores, a função GENERATE_SERIES é uma ferramenta poderosa para criar uma sequência de números dentro de um intervalo especificado. Seja para fins de testes, análises de dados ou outros cenários, essa função permite gerar números de forma eficiente e flexível. Neste post, vamos explorar como usar essa função e entender seus detalhes.

    O que é a Função GENERATE_SERIES?

    A função GENERATE_SERIES foi introduzida no SQL Server 2022 (16.x) e também está disponível no Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure. Ela gera uma sequência de números dentro de um intervalo definido pelo usuário, com a possibilidade de especificar o valor de incremento ou decremento entre os números.

    Aplicações da Função

    A função GENERATE_SERIES pode ser muito útil em diversas situações, incluindo:

    • Criação de intervalos sequenciais: Para gerar números em sequência, como datas ou identificadores.
    • Testes e validações: Para realizar testes em dados gerados automaticamente, sem a necessidade de inserir manualmente os números.
    • Análise de Dados: Ao gerar séries numéricas, você pode usar essas sequências como base para operações analíticas.

    Requisitos de Compatibilidade

    Para usar a função GENERATE_SERIES, é necessário que o banco de dados esteja com o nível de compatibilidade configurado como 160 ou superior. Caso contrário, o SQL Server não reconhecerá a função. Para verificar ou alterar o nível de compatibilidade do banco de dados, use o comando:

    ALTER DATABASE NomeDoBanco SET COMPATIBILITY_LEVEL = 160;
    
    Isso garante que você poderá aproveitar os recursos do SQL Server 2022 e versões mais recentes.

    Sintaxe da Função GENERATE_SERIES

    A sintaxe da função GENERATE_SERIES é simples e fácil de usar:

    GENERATE_SERIES (start, stop [, step])

    Argumentos:

    • start: O valor inicial do intervalo (pode ser tinyint, smallint, int, bigint, decimal, ou numeric).
    • stop: O valor final do intervalo, que deve ser do mesmo tipo de dados que o start.
    • step (opcional): O valor que indica o incremento ou decremento entre os números na sequência. O valor padrão é 1, mas você pode personalizar conforme a necessidade. O valor de step não pode ser zero.

    Tipos de Retorno

    A função retorna uma tabela com uma coluna única chamada value, que contém a sequência gerada. O tipo de dados da coluna será o mesmo de start e stop.


    Exemplo

    Gerando uma sequência de números inteiros de 1 a 10 (incremento padrão de 1)

    Este exemplo gera uma série de números inteiros de 1 a 10, com o incremento padrão de 1:

    SELECT value FROM GENERATE_SERIES(1, 10);
    
    Resultado:
    value
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10


    Considerações Finais

    A função GENERATE_SERIES no SQL Server 2022 (16.x) é uma ferramenta valiosa para gerar séries de números sequenciais. Seja para fins analíticos, de teste ou de cálculos, ela oferece flexibilidade e eficiência, sem a necessidade de manipulações complexas.

  • SQL Server 2022: Facilitando a Gestão de Estatísticas com a Opção AUTO_DROP

    Gerenciar estatísticas no SQL Server sempre foi uma parte essencial do desempenho e da manutenção do banco de dados. No entanto, alterações de esquema em tabelas com estatísticas criadas manualmente costumavam ser um problema — essas estatísticas podiam bloquear mudanças, exigindo ações manuais para removê-las. Felizmente, a partir do SQL Server 2022 (16.x), esse cenário mudou com a introdução da opção AUTO_DROP.

    O Que é AUTO_DROP?

    A opção AUTO_DROP é um novo recurso disponível no SQL Server 2022, no Banco de Dados SQL do Azure e na Instância Gerenciada do SQL do Azure. Com ela, você pode criar estatísticas manuais que se comportam como as estatísticas geradas automaticamente — ou seja, elas não bloqueiam alterações de esquema e são descartadas automaticamente quando não forem mais necessárias.

    Esse comportamento é habilitado por padrão para todos os bancos de dados novos ou migrados no SQL Server 2022.

    Antes do SQL Server 2022

    Se você já precisou excluir uma coluna ou modificar a estrutura de uma tabela, mas foi impedido por estatísticas manuais associadas, sabe o quão frustrante isso pode ser. No SQL Server 2019 e versões anteriores, essas estatísticas precisavam ser removidas manualmente antes de executar as alterações de esquema.

    Com AUTO_DROP

    Agora, ao criar estatísticas com AUTO_DROP = ON, você permite que o SQL Server as remova automaticamente caso elas entrem em conflito com alguma mudança de estrutura. Isso simplifica e agiliza tarefas administrativas e evita que estatísticas antigas fiquem “penduradas” e causem dores de cabeça.

    Criando Estatísticas com AUTO_DROP

    Veja um exemplo de como criar estatísticas com a opção ativada:

    CREATE STATISTICS [minhaEstatistica] 
    ON [dbo].[minhaTabela]([ID], [Data], [Usuario]) 
    WITH AUTO_DROP = ON;
    
    Esse comando cria uma estatística chamada minhaEstatistica na tabela minhaTabela, com AUTO_DROP habilitado.

    Atualizando Estatísticas Existentes

    Se você já tem estatísticas criadas manualmente e quer atualizar a configuração para que também usem a remoção automática, é possível fazer isso facilmente:

    UPDATE STATISTICS [dbo].[minhaTabela] [minhaEstatistica] 
    WITH AUTO_DROP = ON;

    Verificando a Configuração de AUTO_DROP

    Para checar se as estatísticas existentes estão com AUTO_DROP habilitado, você pode consultar a DMV sys.stats:

    SELECT object_id, [name], auto_drop FROM sys.stats;

    A coluna auto_drop indica se a opção está ativa (1) ou não (0).

    Cuidados e Considerações

    • A opção AUTO_DROP não pode ser aplicada em estatísticas criadas automaticamente, pois elas já usam esse comportamento por padrão.
    • Em alguns casos, especialmente ao restaurar backups de versões anteriores para o SQL Server 2022, os metadados da estatística podem vir incorretos. Para corrigir isso, recomenda-se executar o seguinte comando após a restauração:
    EXEC sp_updatestats;
    
    Esse comando atualiza as estatísticas e também ajusta os metadados conforme necessário, garantindo que o comportamento de AUTO_DROP seja aplicado corretamente.

    Conclusão

    A opção AUTO_DROP representa mais um passo em direção à automação e simplificação da administração de bancos de dados no SQL Server. Ela elimina um dos incômodos relacionados à manutenção de estatísticas e ajuda a garantir que as alterações de esquema ocorram sem atritos desnecessários.

    Se você está migrando para o SQL Server 2022 ou já está usando essa versão, aproveite esse recurso para manter seu ambiente mais limpo, organizado e eficiente.

  • Explorando a cláusula WINDOW no SQL Server. Simplificando funções de janela

    Com o SQL Server 2022, novas funcionalidades foram introduzidas para facilitar o uso e a leitura de consultas, especialmente quando se trabalha com funções de janela. Uma dessas adições é a cláusula WINDOW, que permite definir especificações reutilizáveis de janela para funções como ROW_NUMBER(), SUM(), AVG(), entre outras.

    Neste post, vamos entender como essa cláusula funciona, seus benefícios, requisitos e como utilizá-la na prática.


    O que é a cláusula WINDOW?

    A cláusula WINDOW permite nomear uma definição de janela que pode ser reutilizada em várias funções de janela dentro de uma consulta. Isso torna o código mais limpo, legível e menos propenso a erros de repetição.

    Ela é usada em conjunto com a cláusula OVER, que define como as linhas devem ser particionadas e ordenadas para a função de janela.

    Requisitos

    Para utilizar a cláusula WINDOW, o banco de dados deve estar com nível de compatibilidade 160 ou superior. Você pode verificar e alterar isso com os comandos:

    ALTER DATABASE NomeDoBanco SET COMPATIBILITY_LEVEL = 160;

    Sintaxe da cláusula WINDOW

    WINDOW nome_da_janela AS (
    [ janela_referenciada ]
    [ PARTITION BY ... ]
    [ ORDER BY ... ]
    [ ROWS | RANGE ... ]
    )
    • window_name: Nome da janela que será usada na cláusula OVER.
    • PARTITION BY: Divide os dados em grupos.
    • ORDER BY: Ordena os dados dentro de cada partição.
    • ROWS ou RANGE: Define um frame (janela móvel) dentro da partição.

    Vantagens da cláusula WINDOW

    • Reduz duplicação de código SQL.
    • Melhora a legibilidade de consultas com múltiplas funções de janela.
    • Permite construir janelas complexas com base em outras janelas nomeadas.

    Conclusão

    A cláusula WINDOW é uma adição poderosa ao arsenal de quem trabalha com SQL Server, promovendo clareza, organização e eficiência em consultas que envolvem funções analíticas. Se você ainda não testou, experimente utilizá-la em seus relatórios e scripts analíticos!

    Você já utilizou a cláusula WINDOW nas suas queries? Compartilhe sua experiência nos comentários! 👇

  • Juiz da Imagine Cup

    Olá pessoal, esse ano fui escolhido como um dos juízes da Imagine Cup.

    A Imagine Cup é uma competição anual patrocinada e organizada pela Microsoft que reúne estudantes de desenvolvimento do mundo todo para ajudar a resolver alguns dos desafios mais difíceis do mundo. É considerada uma “Olimpíada da Tecnologia” pela ciência da computação e engenharia, sendo considerada uma das principais competições e premiações relacionadas à tecnologia e ao design de software. Todos os competidores da Imagine Cup criam projetos que abordam o tema da Imagine Cup: “Imagine um mundo onde a tecnologia ajuda a resolver os problemas mais difíceis”. Iniciada em 2003, a competição tem crescido constantemente, com mais de 2 milhões de competidores representando 150 países em 2022.

    Tive também a grata surpresa de receber um Certificate of Appreciation por ter participado como voluntário de mais essa iniciativa Microsoft.

  • What’s new on SQL Server 2022 – WAIT_AT_LOW_PRIORITY

    Quando falamos de manutenção de índices em tabelas grandes, especialmente em ambientes de produção com alta concorrência, um dos maiores desafios é evitar o impacto em transações ativas. Pensando nisso, o SQL Server 2022 oferece uma opção extremamente útil: WAIT_AT_LOW_PRIORITY, que torna a criação ou alteração de índices online mais inteligente e menos intrusiva.

    Neste post, vamos entender o que é essa opção, como ela funciona e quando aplicá-la para garantir alta disponibilidade e desempenho.


    O problema: bloqueios durante operações de índice online

    Mesmo ao usar ONLINE = ON em operações de criação ou reconstrução de índice, o SQL Server precisa, em determinado momento, adquirir bloqueios compartilhados (S) ou até bloqueios de modificação de esquema (Sch-M). Esses bloqueios, embora geralmente sejam mantidos por um curto período, podem causar gargalos consideráveis em ambientes de alta concorrência, como:

    • Atrasos em transações de leitura e escrita
    • Aumento da latência em consultas
    • Possíveis timeouts
    • Queda na taxa de throughput

    Isso é especialmente crítico em bancos com alta carga de trabalho ou transações de longa duração.


    A solução: WAIT_AT_LOW_PRIORITY

    Para contornar esses efeitos colaterais, o SQL Server introduziu a opção WAIT_AT_LOW_PRIORITY. Com ela, você pode controlar o comportamento da operação de índice online quando há bloqueios concorrentes, garantindo que o sistema continue fluindo enquanto a operação espera de forma “educada”.

    Como funciona?

    Ao usar WAIT_AT_LOW_PRIORITY, a operação de índice:

    • Espera por bloqueios usando prioridade baixa
    • Permite que outras transações de prioridade normal continuem executando normalmente
    • Só será iniciada se conseguir adquirir os bloqueios necessários dentro de um tempo limite (MAX_DURATION)

    Caso o tempo de espera exceda, você define o que deve acontecer com a operação usando a cláusula ABORT_AFTER_WAIT.


    Sintaxe

    WAIT_AT_LOW_PRIORITY (
    MAX_DURATION = <tempo_em_minutos>,
    ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS]
    )

    Parâmetros:

    • MAX_DURATION: tempo máximo (em minutos) que a operação vai aguardar em baixa prioridade antes de agir. A palavra minutes é opcional e pode ser omitida.
    • ABORT_AFTER_WAIT:
      • NONE: continua esperando com prioridade normal.
      • SELF: cancela a própria operação de índice.
      • BLOCKERS: termina as sessões de usuário que estão bloqueando a operação.

    Exemplo

    CREATE INDEX IX_Clientes_Email
    ON dbo.Clientes(Email)
    WITH (
        ONLINE = ON,
        WAIT_AT_LOW_PRIORITY (
            MAX_DURATION = 10,
            ABORT_AFTER_WAIT = SELF
        )
    );
    

    A operação de índice tentará adquirir os bloqueios necessários por até 10 minutos em baixa prioridade. Se não conseguir, ela será cancelada automaticamente (SELF).


    Monitorando a operação

    Você pode acompanhar o comportamento das operações que usam WAIT_AT_LOW_PRIORITY por meio dos seguintes eventos estendidos:

    • lock_request_priority_state: mostra o estado de prioridade da requisição de bloqueio.
    • process_killed_by_abort_blockers: indica quando processos foram encerrados pela opção BLOCKERS.
    • ddl_with_wait_at_low_priority: rastreia comandos DDL que utilizam a cláusula.

    Conclusão

    A opção WAIT_AT_LOW_PRIORITY é um poderoso recurso do SQL Server que permite equilibrar manutenção proativa de índices com a manutenção da performance do sistema em tempo real. Ao usá-la corretamente, você evita bloqueios desnecessários, melhora a experiência dos usuários e mantém a integridade das operações administrativas.

    Se você lida com tabelas grandes e ambientes com alta carga, considere implementar essa opção em seus scripts de manutenção. Ela pode ser a chave para um ambiente mais estável e previsível.

  • Guia do Mochileiro para manter seu SQL Server Always On

    No último final de semana, tive a satisfação de entregar mais uma palestra em companhia do meu amigo e colega de trabalho Marcelo Adade no SQL Saturday Jacksonville.

    Nesta sessão, vamos nos aprofundar no universo dos Grupos de Disponibilidade Always On do SQL Server e explorar as práticas recomendadas para manter seu SQL Server Always On, combinando também outros recursos. Abordaremos os principais componentes de uma implantação Always On, incluindo configuração de cluster, configurações de rede, configuração de banco de dados e monitoramento. Também discutiremos problemas comuns que podem afetar a disponibilidade do seu ambiente SQL Server e como lidar com eles.

    Caso você queira baixar os materiais da palestra, elas estão disponíveis aqui.

  • Série What’s New on SQL Server 2022 – Operações ADD CONSTRAINT Resumable

    Com o lançamento do SQL Server 2022, Azure SQL Database e Azure SQL Managed Instance, os administradores e desenvolvedores de banco de dados ganharam uma poderosa funcionalidade: operações resumable (resumable operations) para o comando ALTER TABLE ... ADD CONSTRAINT.

    Essa novidade amplia as possibilidades de manutenção em tabelas grandes e melhora em muito a resiliência em ambientes de missão crítica.

    O que são operações resumable?

    As operações resumable permitem que comandos longos e pesados, como a criação ou reconstrução de índices e a partir de agora, a adição de constraints, sejam pausados, retomados ou continuados em caso de falhas. Isso oferece mais flexibilidade em ambientes que exigem alta disponibilidade e pouco tempo de manutenção.

    Os índices resumable já estavam disponíveis para:

    • Criação e reconstrução de índices online (CREATE INDEX / ALTER INDEX)
    • Compatível com SQL Server 2019, Azure SQL Database e Managed Instance

    E agora foi estendido para:

    • ALTER TABLE ADD CONSTRAINT com chaves PRIMARY KEY e UNIQUE KEY
    • Exclusivo no SQL Server 2022 em diante

    Como funciona na prática?

    A operação de ALTER TABLE ADD CONSTRAINT pode demorar horas em tabelas grandes, e antes, qualquer falha exigia reiniciar todo o processo. Com a nova funcionalidade, é possível:

    • Pausar e retomar a operação dentro de janelas de manutenção.
    • Continuar após falhas como quedas de conexão, failover ou falta de espaço em disco.
    • Evitar sobrecarga nos logs de transação, mesmo com pouco espaço disponível.

    Requisitos necessários

    • O comando deve ser executado com a opção ONLINE = ON
    • Só se aplica a PRIMARY KEY e UNIQUE KEY
    • Não há suporte para FOREIGN KEY

    Exemplo de uso

    ALTER TABLE dbo.Clientes
    ADD CONSTRAINT PK_Clientes PRIMARY KEY CLUSTERED (ID)
    WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 60);
    • ONLINE = ON: mantém a tabela disponível durante a operação.
    • RESUMABLE = ON: ativa a operação recomeçável.
    • MAX_DURATION = 60: pausa a operação automaticamente após 60 minutos.

    Como pausar, retomar ou cancelar a operação

    Para pausar, retomar ou cancelar a operação resumable, use os comandos do ALTER INDEX como no exemplo abaixo:

    -- Pausar
    ALTER INDEX PK_Clientes ON dbo.Clientes PAUSE;

    -- Retomar
    ALTER INDEX PK_Clientes ON dbo.Clientes RESUME;

    -- Abortar
    ALTER INDEX PK_Clientes ON dbo.Clientes ABORT;

    Considerações finais

    Essa novidade representa um grande avanço para quem administra bases de dados VLDB (Very Large Databases), especialmente em ambientes que não podem se dar ao luxo de longas janelas de indisponibilidade. As operações resumable trazem resiliência, flexibilidade e melhor aproveitamento dos recursos do servidor.


    Quer mais dicas de T-SQL ou boas práticas para ambientes de alta disponibilidade? Deixe um comentário ou entre em contato!

  • SQL Server 2022 – What’s NEw – Always Encrypted with secure enclaves

    A inclusão do Always Encrypted with Secure Enclaves aprimora os recursos de computação confidencial desse recurso. Ele permite criptografia local e oferece opções mais robustas para conduzir consultas confidenciais. O Always Encrypted com enclaves seguros tem suporte no SQL Server 2019 (15.x) e versões posteriores, bem como no Banco de Dados SQL do Azure.

    O Always Encrypted, que foi introduzido pela primeira vez no Banco de Dados SQL do Azure em 2015 e posteriormente no SQL Server 2016 (13.x), protege dados confidenciais contra malware e usuários não autorizados com altos privilégios, como administradores de banco de dados (DBAs), administradores de computador, administradores de nuvem , ou quaisquer outros indivíduos que tenham acesso legítimo a instâncias de servidor, hardware, etc., mas não devam ter acesso a dados específicos ou a todos os dados.

    Always Encrypted, conforme discutido aqui, fornece proteção de dados criptografando no lado do cliente e garantindo que nem os dados nem as chaves criptográficas sejam expostos em texto simples no Mecanismo de Banco de Dados. Conseqüentemente, os recursos para trabalhar com colunas criptografadas no banco de dados são significativamente limitados. O Mecanismo de Banco de Dados só é capaz de realizar comparações de igualdade em dados criptografados, e isso só é possível com criptografia determinística. Quaisquer outras operações, como operações criptográficas (como criptografia inicial de dados ou rotação de chaves) e consultas mais complexas (como correspondência de padrões), não são suportadas no banco de dados. Para realizar essas operações, os usuários devem transferir seus dados para fora do banco de dados e realizá-los no lado do cliente.


    As limitações associadas à criptografia de dados são resolvidas de forma eficaz pela implementação do Always Encrypted com enclaves seguros. Esta abordagem permite que certos cálculos sejam realizados em dados de texto simples dentro de um enclave seguro localizado no lado do servidor. O enclave seguro, que existe como uma área protegida de memória dentro do processo do Mecanismo de Banco de Dados, é completamente isolado do restante do Mecanismo de Banco de Dados e de outros processos na máquina host. Funciona como uma caixa impenetrável, impermeável à inspeção externa ou a tentativas de depuração. Consequentemente, o enclave seguro serve como um ambiente de execução confiável que pode acessar com segurança dados confidenciais e chaves criptográficas em texto simples, ao mesmo tempo que mantém o nível máximo de confidencialidade dos dados.

    O diagrama abaixo demonstra a utilização de enclaves seguros na implementação do Always Encrypted.

    Ao examinar uma instrução Transact-SQL fornecida por um aplicativo, o Mecanismo de Banco de Dados avalia se a instrução inclui quaisquer ações executadas em dados criptografados que exijam a utilização do enclave seguro. No caso de tais declarações:

    Para garantir a execução segura, o driver cliente transmite com segurança as chaves de criptografia de coluna necessárias para o enclave seguro e envia a instrução para execução.

    O enclave seguro é responsável por manipular operações criptográficas e cálculos em colunas criptografadas quando o Mecanismo de Banco de Dados processa a instrução. Nos casos em que a descriptografia é necessária, o enclave descriptografa os dados e realiza cálculos no texto simples.

    No processo de processamento de instruções, o Mecanismo de Banco de Dados garante que nem os dados nem as chaves de criptografia de coluna sejam expostos em texto simples fora do enclave seguro.