Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
- SQL Server 2025 (configuration étendue à la base de données de fonctionnalités en préversion requise).
- Azure SQL Database (la configuration au niveau de la base de données pour la fonctionnalité en préversion n'est pas requise).
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 :
- 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.
- Activez le streaming d’événements de modification pour une base de données utilisateur.
- 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.
- 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 :
- Espace de noms Azure Event Hubs
- Instance d'Azure Event Hubs
- Nom d’hôte Azure Event Hubs
- Connexion au rôle db_owner ou disposant de l’autorisation CONTROL DATABASE pour la base de données dans laquelle vous envisagez d’activer CES.
- Pour SQL Server 2025 (17.x), activez la configuration étendue à la base de données de fonctionnalités en préversion. Azure SQL Database ne nécessite pas cette configuration.
- Pour qu’Azure SQL Database soit configuré pour utiliser des règles de pare-feu sortantes ou un périmètre de sécurité réseau, autorisez l’accès à la destination Azure Event Hubs :
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.
- Contrôle d’accès en fonction de la stratégie d’accès partagé
- Contrôle d’accès basé sur Microsoft Entra
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 :
- 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.
- Créez une clé maître et des identifiants liés à la base de données.
- Activer la diffusion en continu d’événements.
- Créez le groupe de flux d’événements.
- 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 :
- Transmettre vers Azure Event Hubs via protocole AMQP
- Transmettre en continu vers Azure Event Hubs via 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='
- Valeur de clé primaire ou secondaire extraite de la stratégie d’accès partagé :
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 |
|---|---|
|
|
|
| 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. |
|
|
|
| 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. |
|
|
|
| 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 :
- Base de données SQL Azure
- Limitations générales et au niveau du serveur
- Limitations au niveau de la base de données
- Limitations au niveau de la table
- Limitations au niveau des colonnes
- Autorisations dans la base de données source
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,UPDATEetDELETEDML. - 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
- CES prend uniquement en charge les bases de données configurées avec le modèle de récupération complète.
- CES ne prend pas en charge les bases de données configurées avec des bases de données mises en miroir Fabric pour SQL Server, la réplication transactionnelle, la capture de données modifiées ou Azure Synapse Link. Le suivi des modifications est pris en charge sur les bases de données configurées avec CES.
- CES ne peut diffuser qu’à partir de bases de données primaires accessibles en écriture. Les bases de données secondaires qui font partie de groupes de disponibilité Always On ou qui utilisent le lien Managed Instance ne peuvent pas être configurées en tant que sources de diffusion en continu.
- Vous ne pouvez pas activer CES sur des vues ou des vues matérialisé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 PARTITIONn’est pas pris en charge sur les tables configurées pour CES.TRUNCATE TABLEn’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).