Skip to content
Learni
View all tutorials
Cloud & DevOps

Comment déployer Azure SQL Database en 2026

Introduction

Azure SQL Database est un service PaaS managé par Microsoft Azure, offrant une base de données relationnelle SQL Server hautement scalable, sécurisée et serverless. Contrairement à une instance SQL Server on-premise, elle gère automatiquement les backups, les patches et la haute disponibilité, vous permettant de vous concentrer sur votre code.

Pourquoi l'utiliser en 2026 ? Avec l'essor de l'IA et des apps data-intensive, Azure SQL excelle en scaling auto (jusqu'à 100 To), intégration Hyperscale pour OLTP/OLAP, et chiffrement TDE natif. Ce tutoriel intermediate vous guide pas à pas : déploiement via Azure CLI, configuration firewall, création de tables avec index, queries optimisées, et monitoring. À la fin, vous aurez une DB fonctionnelle connectable à n'importe quelle app (Node.js, .NET, etc.).

Valeur concrète : Économisez 50-70% sur les coûts vs. VM SQL grâce au serverless compute. Testé sur Azure région France Central.

Prérequis

  • Compte Azure actif avec abonnement payant (crédit gratuit insuffisant pour SQL).
  • Azure CLI 2.65+ installé (az --version pour vérifier).
  • Bases en T-SQL et administration Azure (niveau intermediate).
  • Outil SQL comme Azure Data Studio ou sqlcmd pour tester les queries.
  • Variable d'environnement AZURE_SUBSCRIPTION_ID définie (az account show --query id -o tsv).

Créer le groupe de ressources

01-create-resource-group.sh
#!/bin/bash

RESOURCE_GROUP="rg-sql-tutorial-2026"
LOCATION="francecentral"

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION \
  --tags project=tutorial environment=dev

# Vérifier la création
echo "Resource group créé : $(az group show --name $RESOURCE_GROUP --query 'name' -o tsv)"

# Variables pour les étapes suivantes
export RESOURCE_GROUP=$RESOURCE_GROUP
export LOCATION=$LOCATION

Ce script crée un resource group dédié, isolé pour vos tests. Utilisez francecentral pour la souveraineté des données UE. Les tags facilitent le coût-tracking via Azure Cost Management. Piège : Oubliez pas d'exporter les vars pour réutilisation.

Déployer le serveur SQL logique

Un serveur SQL logique est le conteneur pour vos bases de données. Il gère l'authentification et le firewall. Choisissez un admin fort et activez l'auth Microsoft Entra ID pour MFA.

Créer le serveur SQL

02-create-sql-server.sh
#!/bin/bash

SQL_SERVER_NAME="sqlserver-tutorial-$(date +%s)"
ADMIN_LOGIN="sqladmin2026"
ADMIN_PASSWORD="MonP@ssw0rdTr3sS3cur1s2026!"

az sql server create \
  --name $SQL_SERVER_NAME \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --admin-user $ADMIN_LOGIN \
  --admin-password $ADMIN_PASSWORD \
  --enable-public-network true \
  --minimal-tls-version 1.2 \
  --version 16.0

# Activer Microsoft Entra admin (optionnel, nécessite Entra ID)
# az sql server ad-admin create --server-name $SQL_SERVER_NAME --resource-group $RESOURCE_GROUP --display-name "azuread-admin" --object-id "votre-object-id"

export SQL_SERVER_NAME

# Full server name pour connexion
echo "Serveur SQL : ${SQL_SERVER_NAME}.database.windows.net"

Crée un serveur SQL v16 (2022) avec TLS 1.2 min pour sécurité. Le nom doit être unique globalement (timestamp ajouté). Piège majeur : Mot de passe doit avoir 8+ chars, maj/min/chiffre/symbol. Exportez la var pour les étapes suivantes.

Créer la base de données serverless

03-create-database.sh
#!/bin/bash

DB_NAME="sqldb-tutorial"

az sql db create \
  --resource-group $RESOURCE_GROUP \
  --server $SQL_SERVER_NAME \
  --name $DB_NAME \
  --service-objective S0 \
  --compute-model Serverless \
  --min-capacity 0.5 \
  --max-size 32GB \
  --sample-name AdventureWorksLT \
  --edition GeneralPurpose

export DB_NAME

# Vérifier
az sql db show --resource-group $RESOURCE_GROUP --server $SQL_SERVER_NAME --name $DB_NAME --query '{name:name, status:status}' -o table

Déploie une DB GeneralPurpose serverless (auto-pause à 0.5 vCore). AdventureWorksLT remplit avec données échantillon pour tests immédiats. Scaling : min 0.5/max 4 vCore auto. Piège : Serverless pause après 1h inactivité, facturation stoppe.

Configurer le firewall et sécurité

Par défaut, accès bloqué. Ouvrez pour votre IP ou utilisez Managed Identity pour apps. Activez Auditing pour compliance.

Ajouter règle firewall

04-firewall-rule.sh
#!/bin/bash

# Règle pour votre IP actuelle (trouvée via curl ifconfig.me)
CLIENT_IP=$(curl -s ifconfig.me)

az sql server firewall-rule create \
  --resource-group $RESOURCE_GROUP \
  --server $SQL_SERVER_NAME \
  --name AllowClientIP \
  --start-ip-address $CLIENT_IP \
  --end-ip-address $CLIENT_IP

# Règle pour Azure services (ex: App Service)
az sql server firewall-rule create \
  --resource-group $RESOURCE_GROUP \
  --server $SQL_SERVER_NAME \
  --name AllowAzureServices \
  --start-ip-address 0.0.0.0 \
  --end-ip-address 0.0.0.0

# Activer auditing
az sql server update \
  --resource-group $RESOURCE_GROUP \
  --name $SQL_SERVER_NAME \
  --set securityPolicy.state=Enabled securityPolicy.auditingPolicy.auditActionsAndGroups='SCHEMA_OBJECT_CHANGE_GROUP'

Ouvre pour IP client et tous Azure services. Sécurité : Utilisez toujours des règles précises ; supprimez après tests (az sql server firewall-rule delete). Auditing logge changements objets en Log Analytics.

Créer table, index et données

05-create-table.sql
-- Connexion via sqlcmd ou Azure Data Studio:
-- sqlcmd -S ${SQL_SERVER_NAME}.database.windows.net -d ${DB_NAME} -U ${ADMIN_LOGIN} -P ${ADMIN_PASSWORD} -G

USE [sqldb-tutorial];

-- Créer table Users avec clustered index
CREATE TABLE Users (
    Id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
    Email NVARCHAR(255) NOT NULL UNIQUE,
    Name NVARCHAR(100) NOT NULL,
    CreatedAt DATETIME2 DEFAULT SYSDATETIMEOFFSET(),
    IsActive BIT DEFAULT 1
);

-- Index non-clustered pour queries Email
CREATE NONCLUSTERED INDEX IX_Users_Email ON Users(Email) INCLUDE (Name);

-- Insérer données de test
INSERT INTO Users (Email, Name) VALUES
    ('user1@example.com', 'Alice Dupont'),
    ('user2@example.com', 'Bob Martin'),
    ('user3@example.com', 'Charlie Leclerc');

-- Query optimisée
SELECT Id, Email, Name FROM Users WHERE Email = 'user1@example.com' AND IsActive = 1;

-- Vérifier count
SELECT COUNT(*) AS TotalUsers FROM Users;

Script complet : table avec PK GUID (meilleur qu'INT pour distributed), index pour perf queries. Analogie : Clustered index = ordre physique des pages (comme un livre classé). Testez avec sqlcmd pour valider. Piège : Oubliez pas USE DB.

Scaling et monitoring

06-scale-monitor.sh
#!/bin/bash

# Scale vers Serverless 2 vCore max
az sql db update \
  --resource-group $RESOURCE_GROUP \
  --server $SQL_SERVER_NAME \
  --name $DB_NAME \
  --service-objective GP_Serveless \
  --max-size 100GB

# Activer auto-scaling (serverless auto)

# Monitoring : Query perf via DMV (exécuter en SQL)
# SELECT * FROM sys.dm_db_resource_stats WHERE end_time > DATEADD(minute, -15, SYSDATETIME());

# Alertes CPU >80%
az monitor metrics alert create \
  --name HighCPUAlert \
  --resource-group $RESOURCE_GROUP \
  --scopes "/subscriptions/$AZURE_SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Sql/servers/$SQL_SERVER_NAME/databases/$DB_NAME" \
  --condition "avg Percentage_CPU > 80" \
  --description "Alerte CPU élevée sur DB tutorial"

# Cleanup (exécuter à la fin)
# az group delete --name $RESOURCE_GROUP --yes --no-wait

Scale dynamique pour pics trafic. DMV sys.dm_db_resource_stats = tableau de bord perf gratuit. Alerte push via email/Action Group. Piège : Subscriptions ID requis pour monitoring cross-RG.

Bonnes pratiques

  • Serverless first : Idéal pour workloads variables ; pause auto sauve 60% coûts.
  • Utilisez Microsoft Entra ID pour auth sans mots de passe (Managed Identities).
  • Index + Query Store : Activez (ALTER DATABASE SET QUERY_STORE = ON) pour auto-tuning.
  • Private Endpoint : Pour prod, évitez public internet via VNet.
  • Geo-replication : az sql db create --create-mode Replica pour DRP.

Erreurs courantes à éviter

  • Firewall bloqué : Toujours ajouter IP client ou AllowAzureServices avant connexion.
  • Nom serveur non unique : Ajoutez timestamp ou UUID.
  • Coûts cachés : Serverless pause ok, mais backups (7j retention) facturés ; monitor via Cost Analysis.
  • TLS obsolète : Forcez 1.2+ ; sinon, connexion refusée depuis clients modernes.

Pour aller plus loin