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

Como criar External Tables com CETAS no Azure Synapse

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

O comando CETAS (CREATE EXTERNAL TABLE AS SELECT) no Azure Synapse lê dados em bruto do Data Lake, transforma-os com SQL e grava o resultado já otimizado em Parquet, criando ao mesmo tempo uma External Table pronta a consultar. É a forma mais simples de construir uma camada "curated" no SQL serverless, sem copiar dados para fora do lake nem pagar por infraestrutura dedicada. O exemplo seguinte parte de ficheiros CSV de vendas e produz uma tabela agregada por país.

Pré-requisitos

  • Um workspace de Azure Synapse Analytics com o pool SQL serverless (Built-in).
  • Uma conta ADLS Gen2 com ficheiros CSV numa pasta (por exemplo raw/vendas/).
  • A permissão Storage Blob Data Contributor na conta de armazenamento — o CETAS precisa de escrever ficheiros no lake.
  • O Synapse Studio aberto, com um novo script SQL ligado ao pool Built-in.

Passo 1: Criar a base de dados e a master key

Como uma External Table é um objeto de base de dados, começa por criar uma base de dados própria (não uses a master). A master key é necessária para proteger a credencial que vais criar a seguir.

CREATE DATABASE VendasDW;
GO
USE VendasDW;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Uma-Password-Forte-2026!';

Passo 2: Ligar ao Data Lake

Vais indicar ao Synapse onde estão os dados e como se autenticar. A forma mais segura é usar a Managed Identity do workspace, evitando guardar chaves. Substitui aconta pelo nome real da tua conta de armazenamento.

CREATE DATABASE SCOPED CREDENTIAL cred_managed_id
WITH IDENTITY = 'Managed Identity';
GO
CREATE EXTERNAL DATA SOURCE lake_dados
WITH (
    LOCATION = 'https://aconta.dfs.core.windows.net/dados',
    CREDENTIAL = cred_managed_id
);

Confirma que a identidade gerida do workspace tem o papel Storage Blob Data Contributor no container dados, caso contrário o passo seguinte falha com um erro de permissões.

Passo 3: Definir o formato de saída

O CETAS grava os resultados em ficheiros. Aqui escolhes Parquet com compressão Snappy — a melhor opção para consultas rápidas e económicas, porque é um formato colunar e comprimido.

CREATE EXTERNAL FILE FORMAT parquet_snappy
WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);

Passo 4: Executar o CETAS

Agora juntas tudo. A cláusula SELECT lê os CSV em bruto com OPENROWSET e agrega as vendas por país; o resultado é escrito em Parquet na pasta curated/vendas_por_pais/ e exposto como a External Table dbo.VendasPorPais.

CREATE EXTERNAL TABLE dbo.VendasPorPais
WITH (
    LOCATION = 'curated/vendas_por_pais/',
    DATA_SOURCE = lake_dados,
    FILE_FORMAT = parquet_snappy
)
AS
SELECT
    pais,
    COUNT(*)   AS num_vendas,
    SUM(valor)  AS total_valor
FROM OPENROWSET(
    BULK 'raw/vendas/*.csv',
    DATA_SOURCE = 'lake_dados',
    FORMAT = 'CSV',
    PARSER_VERSION = '2.0',
    HEADER_ROW = TRUE
) AS origem
GROUP BY pais;

Repara que a pasta de destino em LOCATION tem de estar vazia. Se já existir, o CETAS devolve um erro — é uma proteção para não sobrescrever dados por engano.

Dica: dá sempre um nome descritivo à pasta de destino (por exemplo, o nome da tabela). Assim é fácil localizar e limpar os ficheiros quando precisares de refrescar os dados.

Verificar o resultado

Consulta a nova tabela como se fosse uma tabela normal:

SELECT TOP 10 *
FROM dbo.VendasPorPais
ORDER BY total_valor DESC;

Depois, no separador Data do Synapse Studio, abre o container e confirma que a pasta curated/vendas_por_pais/ contém um ou mais ficheiros .parquet. Se vês linhas na consulta e ficheiros na pasta, o CETAS correu com sucesso.

Conclusão

Com poucas linhas de SQL criaste uma camada curated em Parquet e uma External Table pronta para o Power BI, tudo sem sair do Data Lake. Um ponto importante: o CETAS não atualiza dados existentes. Para refrescar, apaga a External Table com DROP EXTERNAL TABLE, remove os ficheiros da pasta e volta a executar — ou grava cada carga numa pasta com data. Qual vai ser a primeira tabela do teu lake que faz sentido materializar assim?