(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como mascarar dados sensíveis no Azure SQL (Data Masking)

João Barros 05 de July de 2026 4 min de leitura

Proteger dados pessoais como emails e numeros de cartao e uma exigencia basica de governanca de dados — e nem sempre obriga a reescrever a aplicacao. O Dynamic Data Masking do Azure SQL esconde colunas sensiveis nos resultados das consultas, mostrando os valores reais apenas a quem tem permissao. Assim, um analista ve apenas aXXX@XXXX.com enquanto os dados na tabela permanecem intactos.

Pre-requisitos

  • Uma base de dados no Azure SQL Database (ou SQL Server 2022) onde tenhas permissoes de administrador.
  • Uma ferramenta de consulta como o SQL Server Management Studio (SSMS) ou o Azure Data Studio.
  • Conhecimentos basicos de T-SQL (CREATE TABLE, SELECT, ALTER TABLE).

Passo 1: Criar uma tabela de exemplo

Vamos comecar com uma tabela de clientes que guarda dados sensiveis. Executa o script seguinte para a criar e inserir alguns registos:

CREATE TABLE dbo.Clientes (
    ClienteID   INT IDENTITY PRIMARY KEY,
    Nome        NVARCHAR(100),
    Email       NVARCHAR(100),
    Telemovel   VARCHAR(20),
    Cartao      VARCHAR(19)
);

INSERT INTO dbo.Clientes (Nome, Email, Telemovel, Cartao)
VALUES
 (N'Ana Silva',   'ana.silva@email.pt',   '912345678', '4111111111111111'),
 (N'Bruno Costa', 'bruno.costa@email.pt', '936000111', '5500005555555559');

Passo 2: Aplicar mascaras as colunas sensiveis

Uma mascara define-se por coluna com a clausula ADD MASKED WITH (FUNCTION = '...'). Cada funcao esconde os dados de forma diferente. Vamos mascarar o email, o telemovel e o cartao:

-- email(): mostra a 1.a letra e o dominio -> aXXX@XXXX.com
ALTER TABLE dbo.Clientes
    ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');

-- partial(): mostra apenas os ultimos 3 digitos -> XXXXXX678
ALTER TABLE dbo.Clientes
    ALTER COLUMN Telemovel ADD MASKED WITH (FUNCTION = 'partial(0,"XXXXXX",3)');

-- default(): esconde o valor por completo -> XXXX
ALTER TABLE dbo.Clientes
    ALTER COLUMN Cartao ADD MASKED WITH (FUNCTION = 'default()');

A funcao partial(prefixo, preenchimento, sufixo) e a mais flexivel: o primeiro numero diz quantos caracteres iniciais manter, o texto entre aspas e o preenchimento visivel, e o ultimo numero quantos caracteres finais manter. Ja o default() aplica a mascara por omissao do tipo de dados — XXXX para texto, 0 para numeros e uma data fixa para datas.

Passo 3: Criar um utilizador para testar

As mascaras nao se aplicam a administradores (membros de db_owner), por isso nao veras qualquer efeito com a tua conta. Para o comprovar, cria um utilizador sem privilegios e da-lhe apenas permissao de leitura:

CREATE USER analista WITHOUT LOGIN;
GRANT SELECT ON dbo.Clientes TO analista;

Passo 4: Confirmar a mascara com EXECUTE AS

Podes assumir temporariamente a identidade desse utilizador para ver os dados exatamente como ele os veria, sem trocar de sessao:

EXECUTE AS USER = 'analista';
SELECT Nome, Email, Telemovel, Cartao FROM dbo.Clientes;
REVERT;

O resultado mostra os emails como aXXX@XXXX.com, o telemovel a terminar nos ultimos digitos e o cartao totalmente escondido. Os dados na base continuam intactos — so a apresentacao muda.

Passo 5: Conceder excecoes com UNMASK

Se um perfil especifico precisar de ver os valores reais (por exemplo, o apoio ao cliente), concede-lhe a permissao UNMASK. Desde o SQL Server 2022 e no Azure SQL podes faze-lo tambem ao nivel da coluna:

-- Acesso total aos valores reais
GRANT UNMASK TO analista;

-- Ou apenas a uma coluna (granular, SQL Server 2022 / Azure SQL)
GRANT UNMASK ON dbo.Clientes(Email) TO analista;

Para retirar a excecao mais tarde, usa REVOKE UNMASK .... Concede sempre o minimo necessario a cada perfil.

Verificar o resultado

Para listar todas as colunas mascaradas e a funcao aplicada, consulta a vista de sistema sys.masked_columns:

SELECT t.name AS Tabela, c.name AS Coluna, c.masking_function AS Mascara
FROM sys.masked_columns AS c
JOIN sys.tables AS t ON c.object_id = t.object_id
WHERE c.is_masked = 1;

Deves ver as tres colunas com a respetiva funcao de mascara. Se voltares a correr o SELECT com EXECUTE AS depois do GRANT UNMASK, os valores aparecem agora sem mascara.

Conclusao

Com poucas linhas de T-SQL protegeste dados sensiveis sem tocar na aplicacao nem duplicar tabelas. O proximo passo e definir a estrategia de excecoes: quem precisa mesmo de UNMASK e a que colunas. Lembra-te de que o masking e uma camada de apresentacao, nao de seguranca absoluta — combina-o sempre com controlo de acessos e, quando possivel, encriptacao. Que colunas da tua base merecem uma mascara ja hoje?