Partager via


Configurer le streaming d’événements de modification (aperçu)

S’applique à : SQL Server 2025 (17.x) Azure SQL Database

Cet article explique comment configurer la fonctionnalité streaming d'événements de modification (CES) introduite dans SQL Server 2025 (17.x) et Azure SQL Database.

Remarque

La diffusion en continu d'événements est actuellement en préversion pour :

Pendant la préversion, cette fonctionnalité est susceptible de changer. Pour connaître la prise en charge actuelle, consultez Limitations.

Aperçu

Pour configurer et utiliser le streaming d’événements de modification, procédez comme suit :

  1. Utilisez un espace de noms Azure Event Hubs existant ou créez une instance Event Hubs. L’instance Event Hubs reçoit des événements.
  2. Activez le streaming d’événements de modification pour une base de données utilisateur.
  3. Créez un groupe de flux d’événements. Avec ce groupe, configurez la destination, les informations d’identification, les limites de taille des messages et le schéma de partitionnement.
  4. Ajoutez une ou plusieurs tables au groupe de flux d’événements.

Chaque étape est décrite en détail dans les sections suivantes de cet article.

Conditions préalables

Pour configurer la diffusion en continu des événements, vous avez besoin des ressources, des autorisations et de la configuration suivantes :

Configurer Azure Event Hubs

Pour savoir comment créer Azure Event Hubs, consultez Créer un hub d’événements à l’aide du portail Azure.

Contrôle d’accès Azure Event Hubs

Configurez le contrôle d’accès pour votre ressource SQL sur Azure Event Hubs. L’authentification Microsoft Entra est la méthode la plus sécurisée, mais elle est actuellement uniquement prise en charge par Azure SQL Database pour CES. Bien que l’utilisation d’une stratégie d’accès partagé soit prise en charge par Azure SQL Database et SQL Server 2025, utilisez-la uniquement dans Azure SQL Database si l’authentification Microsoft Entra n’est pas une option.

Les stratégies d’accès partagé fournissent l’authentification et l’autorisation à Azure Event Hubs. Chaque stratégie d’accès partagé a besoin d’un nom, d’un niveau d’accès (ManageouSendListen) et d’une liaison de ressources (espace de noms Event Hubs ou instance Event Hub spécifique). Les stratégies au niveau de l’instance offrent davantage de sécurité en suivant le principe du privilège minimum. SQL Server 2025 et Azure SQL Database prennent en charge cette méthode. Toutefois, utilisez l’authentification Microsoft Entra dans la mesure du possible avec Azure SQL Database, car elle offre une meilleure sécurité.

Si vous utilisez une stratégie d’accès partagé pour l’authentification et l’autorisation, les clients qui envoient des données à un Hub d’événements Azure doivent fournir le nom de la stratégie à utiliser, ainsi qu’un jeton SAP généré à partir de la stratégie ou de la clé de service de la stratégie.

Les jetons SAP présentent un avantage de sécurité par rapport aux clés de service : si le client est compromis, le jeton SAP n’est valide que jusqu’à son expiration, et le client compromis ne peut pas créer de jetons SAP. En revanche, les clés de service n’expirent pas automatiquement. Un client compromis avec une clé de service peut générer de nouveaux jetons SAP à l’aide de la clé.

Pour configurer la diffusion en continu vers Azure Event Hubs avec le protocole AMQP (protocole Azure Event Hubs natif par défaut), créez ou réutilisez une stratégie d’accès partagé avec l’autorisation d’envoi et générez un jeton SAP. Vous pouvez générer le jeton par programmation avec n’importe quel langage de programmation ou de script. L’exemple de cet article montre comment générer un jeton SAP à partir d’une stratégie nouvelle ou existante à l’aide d’un script PowerShell.

Remarque

Pour améliorer la sécurité, l’utilisation du contrôle d’accès basé sur Microsoft Entra dans la mesure du possible est fortement recommandée. Si le contrôle d’accès basé sur Microsoft Entra n’est pas possible et que vous utilisez des stratégies d’accès partagé, utilisez l’authentification par jeton SAP au lieu de l’authentification basée sur des clés de service dans la mesure du possible. Les meilleures pratiques pour les jetons SAP incluent la définition d’une étendue d’accès minimalement requise, la définition d’une date d’expiration courte et la rotation de la clé SAP régulièrement. Pour l’authentification basée sur des clés, faites pivoter régulièrement les clés. Stockez tous les secrets en toute sécurité à l’aide d’Azure Key Vault ou d’un service similaire.

Installer les modules requis

Pour gérer les ressources Azure Event Hubs avec des scripts PowerShell, vous avez besoin des modules suivants :

  • Module Az PowerShell
  • Module Az.EventHub PowerShell

Le script suivant installe les modules requis :

Install-Module -Name Az -AllowClobber -Scope CurrentUser -Repository PSGallery -Force
Install-Module -Name Az.EventHub -Scope CurrentUser -Force

Si vous disposez déjà des modules requis et que vous souhaitez les mettre à jour vers la dernière version, exécutez le script suivant :

Update-Module -Name Az -Force
Update-Module -Name Az.EventHub -Force

Se connecter à Azure

Vous pouvez utiliser Azure Cloud Shell ou vous connecter et définir votre contexte d’abonnement.

Pour s’exécuter avec Azure Cloud Shell, passez en revue La connexion à Azure.

Définir une stratégie

Pour créer le jeton SAP, vous avez besoin d’une stratégie avec des droits d’envoi . Vous pouvez :

  • Créer une stratégie

    ou

  • Utiliser une stratégie existante

Remarque

La politique doit avoir des droits d’envoi.

Créer un jeton SAP pour une stratégie nouvelle ou existante

Lorsque vous créez une stratégie, vérifiez qu’elle dispose du droit d’envoi . Si vous utilisez une stratégie existante, vérifiez qu’elle a le droit Envoyer.

Le script suivant crée une stratégie ou obtient une stratégie existante, puis génère un jeton SAP complet dans un format d’en-tête d’autorisation HTTP.

Remplacez les valeurs entre crochets (<value>) par des valeurs pour votre environnement.

function Generate-SasToken {
$subscriptionId = "<Azure-Subscription-ID>"
$resourceGroupName = "<Resource-group-name>"
$namespaceName = "<Azure-Event-Hub-Namespace-name>"
$eventHubName = "<Azure-Event-Hubs-instance-name>"
$policyName = "<Policy-name>"
$tokenExpireInDays = "<number-of-days-token-will-be-valid>"

# Modifying the rest of the script is not necessary.

# Login to Azure and set Azure Subscription.
Connect-AzAccount

# Get current context and check subscription
$currentContext = Get-AzContext
if ($currentContext.Subscription.Id -ne $subscriptionId) {
    Write-Host "Current subscription is $($currentContext.Subscription.Id), switching to $subscriptionId..."
    Set-AzContext -SubscriptionId $subscriptionId | Out-Null
} else {
    Write-Host "Already using subscription $subscriptionId."
}

# Try to get the authorization policy (it should have Send rights)
$rights = @("Send")
$policy = Get-AzEventHubAuthorizationRule -ResourceGroupName $resourceGroupName -NamespaceName $namespaceName -EventHubName $eventHubName -AuthorizationRuleName $policyName -ErrorAction SilentlyContinue

# If the policy does not exist, create it
if (-not $policy) {
    Write-Output "Policy '$policyName' does not exist. Creating it now..."

    # Create a new policy with the Manage, Send and Listen rights
    $policy = New-AzEventHubAuthorizationRule -ResourceGroupName $resourceGroupName -NamespaceName $namespaceName -EventHubName $eventHubName -AuthorizationRuleName $policyName -Rights $rights
    if (-not $policy) {
        throw "Error. Policy was not created."
    }
    Write-Output "Policy '$policyName' created successfully."
} else {
    Write-Output "Policy '$policyName' already exists."
}

if ("Send" -in $policy.Rights) {
    Write-Host "Authorization rule has required right: Send."
} else {
    throw "Authorization rule is missing Send right."
}

$keys = Get-AzEventHubKey -ResourceGroupName $resourceGroupName -NamespaceName $namespaceName -EventHubName $eventHubName -AuthorizationRuleName $policyName

if (-not $keys) {
    throw "Could not obtain Azure Event Hub Key. Script failed and will end now."
}
if (-not $keys.PrimaryKey) {
    throw "Could not obtain Primary Key. Script failed and will end now."
}

# Get the Primary Key of the Shared Access Policy
$primaryKey = ($keys.PrimaryKey)
Write-Host $primaryKey

## Check that the primary key is not empty.

# Define a function to create a SAS token (similar to the C# code provided)
function Create-SasToken {
    param (
        [string]$resourceUri, [string]$keyName, [string]$key
    )

$sinceEpoch = [datetime]::UtcNow - [datetime]"1970-01-01"
    $expiry = [int]$sinceEpoch.TotalSeconds + ((60 * 60 * 24) * [int]$tokenExpireInDays) # seconds since Unix epoch
    $stringToSign = [System.Web.HttpUtility]::UrlEncode($resourceUri) + "`n" + $expiry
    $hmac = New-Object System.Security.Cryptography.HMACSHA256
    $hmac.Key = [Text.Encoding]::UTF8.GetBytes($key)
    $signature = [Convert]::ToBase64String($hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($stringToSign)))
    $sasToken = "SharedAccessSignature sr=$([System.Web.HttpUtility]::UrlEncode($resourceUri))&sig=$([System.Web.HttpUtility]::UrlEncode($signature))&se=$expiry&skn=$keyName"
    return $sasToken
}

# Construct the resource URI for the SAS token
$resourceUri = "https://$namespaceName.servicebus.windows.net/$eventHubName"

# Generate the SAS token using the primary key from the new policy
$sasToken = Create-SasToken -resourceUri $resourceUri -keyName $policyName -key $primaryKey

# Output the SAS token
Write-Output @"
-- Generated SAS Token --
$sasToken
-- End of generated SAS Token --
"@
}

Generate-SasToken

La sortie de la commande précédente doit ressembler au texte suivant :

-- Generated SAS Token --
SharedAccessSignature sr=https%3a%2f%YourEventHubNamespace.servicebus.windows.net%2fYourEventHub&sig=xxxxxxxxxxxxxxxxxxxxxxx&se=2059133074&skn=SharedKeyNameIsHERE
-- End of generated SAS Token --

Copiez l’intégralité de la valeur du jeton SAP (la ligne qui commence par SharedAccessSignature) pour l’utiliser ultérieurement lorsque vous configurez CES, comme l’exemple suivant :

SharedAccessSignature sr=https%3a%2f%YourEventHubNamespace.servicebus.windows.net%2fYourEventHub&sig=xxxxxxxxxxxxxxxxxxxxxxx&se=2059133074&skn=SharedKeyNameIsHERE

Activer et configurer le streaming d’événements de modification

Pour activer et configurer le streaming des événements de modification, remplacez le contexte de base de données par la base de données utilisateur, puis procédez comme suit :

  1. S’il n’est pas déjà configuré, définissez la base de données sur le modèle de récupération complète.
  2. Créez une clé maître et des identifiants liés à la base de données.
  3. Activer la diffusion en continu d’événements.
  4. Créez le groupe de flux d’événements.
  5. Ajoutez une ou plusieurs tables au groupe de flux d’événements.

Les exemples de cette section montrent comment activer CES pour le protocole AMQP et le protocole Apache Kafka :

Voici des exemples de valeurs de paramètre pour les exemples de cette section :

  • @stream_group_name = N'myStreamGroup'

  • @destination_location = N'myEventHubsNamespace.servicebus.windows.net/myEventHubsInstance' - cette valeur est le nom de domaine pleinement qualifié (FQDN) d’Azure Event Hubs et le nom d’instance spécifique.

  • @partition_key_scheme = N'None' - (par défaut) les partitions sont choisies en rotation. D’autres options possibles sont les suivantes :

    • StreamGroup - partitionnement par le groupe de flux
    • Table - partitionnement par table
    • Column - partitionnement par colonnes
  • [facultatif, si les stratégies d’accès partagé via la clé de service sont utilisées]

    • Valeur de clé primaire ou secondaire extraite de la stratégie d’accès partagé : Secret = 'BVFnT3baC/K6I8xNZzio4AeoFt6nHeK0i+ZErNGsxiw='
  • EXEC sys.sp_add_object_to_event_stream_group N'myStreamGroup', N'dbo.myTable'

  • @max_message_size_kb = 256 - 256 Ko est la taille de message maximale par défaut, mais cette valeur doit être alignée sur les limites d’Azure Event Hubs de destination.

Exemple : Diffuser en continu vers Azure Event Hubs via le protocole AMQP

Les exemples de cette section montrent comment diffuser en continu des événements de modification vers Azure Event Hubs à l’aide du protocole AMQP. AMQP est le protocole Azure Event Hubs natif par défaut.

L’exemple de cette section utilise un jeton SAP pour s’authentifier auprès de votre instance Azure Event Hubs via le protocole AMQP. Si l’authentification Microsoft Entra n’est pas disponible, utilisez un jeton SAP au lieu d’une valeur de clé de service pour améliorer la sécurité.

Remplacez les valeurs entre crochets (<value>) par des valeurs pour votre environnement.

USE <database name>;

-- Create the Master Key with a password.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Password>';

CREATE DATABASE SCOPED CREDENTIAL <CredentialName>
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = '<Generated SAS Token>' -- Be sure to copy the entire token. The SAS token starts with "SharedAccessSignature sr="

EXEC sys.sp_enable_event_stream

EXEC sys.sp_create_event_stream_group
    @stream_group_name =      N'<EventStreamGroupName>',
    @destination_type =       N'AzureEventHubsAmqp',
    @destination_location =   N'<AzureEventHubsHostName>/<EventHubsInstance>',
    @destination_credential = <CredentialName>,
    @max_message_size_kb =    <MaxMessageSize>,
    @partition_key_scheme =   N'<PartitionKeyScheme>'

EXEC sys.sp_add_object_to_event_stream_group
    N'<EventStreamGroupName>',
    N'<SchemaName>.<TableName>'

Exemple : Diffuser en continu vers Azure Event Hubs via le protocole Apache Kafka

Les exemples de cette section montrent comment diffuser en continu des événements de modification vers Azure Event Hubs à l’aide du protocole Apache Kafka.

L’exemple de cette section utilise un jeton SAP pour s’authentifier auprès de votre instance Azure Event Hubs via le protocole Apache Kafka. Si l’authentification Microsoft Entra n’est pas disponible, utilisez un jeton SAP au lieu d’une valeur de clé de service pour améliorer la sécurité.

Remplacez les valeurs entre crochets (<value>) par des valeurs pour votre environnement.

USE <database name>

-- Create the Master Key with a password.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Password>'

CREATE DATABASE SCOPED CREDENTIAL <CredentialName>
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = '<Event Hubs Namespace – Primary or Secondary connection string>'

EXEC sys.sp_enable_event_stream

EXEC sys.sp_create_event_stream_group
    @stream_group_name =      N'<EventStreamGroupName>',
    @destination_type =       N'AzureEventHubsApacheKafka',
    @destination_location =   N'<AzureEventHubsHostName>:<port>/<EventHubsInstance>', -- myEventHubsNamespace.servicebus.windows.net:9093/myEventHubsInstance
    @destination_credential = <CredentialName>,
    @max_message_size_kb =    <MaxMessageSize>,
    @partition_key_scheme =   N'<PatitionKeyScheme>'

EXEC sys.sp_add_object_to_event_stream_group
    N'<EventStreamGroupName>',
    N'<SchemaName>.<TableName>'

Afficher la configuration et la fonction CES

Dans sys.databases, is_event_stream_enabled = 1 indique que le streaming d’événements de modification est activé pour la base de données.

La requête suivante retourne toutes les bases de données avec le streaming d’événements de modification activé :

SELECT *
FROM sys.databases
WHERE is_event_stream_enabled = 1;

Dans sys.tables, is_replicated = 1 indique qu’une table est diffusée en continu et sp_help_change_feed_table fournit des informations sur le groupe de tables et les métadonnées de table pour le streaming des événements de modification.

La requête suivante retourne toutes les tables avec le streaming d’événements de modification activé et fournit des informations de métadonnées :

SELECT name,
       is_replicated
FROM sys.tables;

EXECUTE sp_help_change_feed_table
    @source_schema = '<schema name>',
    @source_name = '<table name>';

Procédures stockées, fonctions système et DMV CES

Le tableau suivant répertorie les procédures stockées, les fonctions système et les DMV que vous pouvez utiliser pour configurer, désactiver et surveiller le streaming des événements de modification :

Objet System Descriptif
Configurer CES
sys.sp_enable_event_stream Active CES pour la base de données utilisateur actuelle.
sys.sp_create_event_stream_group Crée un groupe de flux, qui est une configuration de streaming pour un groupe de tables. Le groupe de flux définit également la destination et les détails associés (par exemple, l’authentification, la taille des messages, le partitionnement). Le stream_group_id est automatiquement généré et affiché pour l’utilisateur final une fois la procédure terminée.
sys.sp_add_object_to_event_stream_group Ajoute une table au groupe de flux.
Désactiver CES
sys.sp_remove_object_from_event_stream_group Supprime une table du groupe de flux de données.
sys.sp_drop_event_stream_group Supprime le groupe de flux. Le groupe de flux ne doit pas être utilisé.
sys.sp_disable_event_stream Désactive CES pour la base de données utilisateur actuelle.
Surveiller CES
sys.dm_change_feed_errors Retourne des erreurs de livraison.
sys.dm_change_feed_log_scan_sessions Retourne des informations sur l’activité d’analyse des journaux.
sys.sp_help_change_feed_settings Fournit l’état et les informations du streaming des événements de modification configurés.
sys.sp_help_change_feed Surveille la configuration actuelle du flux de modification.
sys.sp_help_change_feed_table_groups Retourne les métadonnées utilisées pour configurer les groupes de streaming d’événements de modification.
sys.sp_help_change_feed_table Fournit l’état et les informations du groupe de streaming et des métadonnées de table pour la diffusion des événements de modification.

Limites

Change Event Streaming (CES) présente les limitations suivantes :

Azure SQL Database

Les limitations suivantes s’appliquent lors de l’utilisation de CES avec Azure SQL Database :

  • Le débogage d’événements étendus (xEvent) dans Azure SQL Database n’est actuellement pas disponible.

Limitations générales et au niveau du serveur

  • CES n’est pas pris en charge sur SQL Server 2025 (17.x) sur Linux.
  • CES émet des événements uniquement pour les modifications de données provenant des instructions INSERT, UPDATE et DELETE DML.
  • CES ne gère pas les modifications de schéma (opérations DDL), ce qui signifie qu’elle n’émet pas d’événements pour les opérations DDL. Toutefois, les opérations DDL ne sont pas bloquées. Par conséquent, si vous les exécutez, le schéma des événements DML suivants reflète la structure de table mise à jour. Vous êtes censé gérer correctement les événements avec le schéma mis à jour.
  • Actuellement, CES ne transmet pas en continu les données qui existent dans une table avant que CES ne soit activé. Les données existantes ne sont ni amorcées ni envoyées comme une capture instantanée lorsque CES est activé.
  • Lorsque JSON est le format de sortie spécifié, les messages d’événements volumineux peuvent être fractionnés à environ 25% de la taille maximale de message configurée par groupe de flux. Cette limitation ne s’applique pas au type de sortie binaire.
  • Si un message dépasse la limite de taille du message Azure Event Hubs, l’échec n’est actuellement observable que par le biais d’événements étendus. Ces xEvents sont actuellement disponibles uniquement dans SQL Server 2025, et non dans Azure SQL Database.
  • Le changement de nom des tables et des colonnes pour CES n’est pas pris en charge. Le changement de nom d’une table ou d’une colonne échoue. Les renommages de base de données sont autorisés.
  • L’authentification Microsoft Entra pour CES n’est actuellement pas disponible dans SQL Server 2025.

Limitations au niveau de la base de données

Limitations au niveau de la table

  • Une table ne peut appartenir qu’à un seul groupe de diffusion en continu. Vous ne pouvez pas diffuser la même table vers plusieurs destinations.

  • Vous pouvez uniquement configurer des tables utilisateur pour CES. CES ne prend pas en charge les tables système de diffusion en continu.

  • Vous pouvez configurer jusqu’à 4 096 groupes de flux. Chaque groupe de flux peut inclure jusqu’à 40 000 tables.

  • Les opérations d’index en ligne ne sont pas prises en charge

  • Si CES est activé sur une table, vous ne pouvez pas ajouter ou supprimer une contrainte de clé primaire sur cette table.

  • ALTER TABLE SWITCH PARTITION n’est pas pris en charge sur les tables configurées pour CES.

  • TRUNCATE TABLE n’est pas pris en charge sur les tables activées pour CES.

  • CES ne prend pas en charge les tables qui utilisent l’une des fonctionnalités suivantes :

    • Index columnstore en cluster
    • Tables d’historique temporelle ou tables d’historique de registre
    • Toujours Chiffré
    • OLTP en mémoire (tables mémoire optimisées)
    • Tableaux de graphiques
    • Tables externes

Limitations au niveau des colonnes

  • CES ne prend pas en charge les types de données suivants. Le streaming ignore les colonnes de ces types :
    • geography
    • geometry
    • image
    • json
    • rowversion / horodateur
    • sql_variant
    • texte / ntexte
    • vector
    • xml
    • Types définis par l’utilisateur (UDT)

Autorisations dans la base de données source

  • Pour la sécurité au niveau des lignes, CES émet des modifications de toutes les lignes, indépendamment des autorisations des utilisateurs.
  • Le masquage dynamique des données ne s’applique pas aux données envoyées via CES. Les données sont diffusées en continu non masquées, même si le masquage est configuré.
  • CES n’émet pas d’événements liés aux modifications d’autorisation au niveau de l’objet (par exemple, l’octroi d’autorisations à des colonnes spécifiques).