Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
Se aplica a: SQL Server 2025 (17.x)
Azure SQL Database
En este artículo se describe cómo configurar la característica de streaming de eventos de cambio (CES) introducida en SQL Server 2025 (17.x) y Azure SQL Database.
Nota:
El streaming de eventos de cambio se encuentra actualmente en versión preliminar para:
- SQL Server 2025 (se requiere una configuración con ámbito de base de datos de características en versión preliminar).
- Azure SQL Database (no se requiere la configuración de ámbito de la base de datos de características en versión preliminar).
Durante la versión preliminar, esta característica está sujeta a cambios. Para obtener compatibilidad actual, consulte Limitaciones.
Información general
Para configurar y usar el streaming de eventos de cambio, siga estos pasos:
- Use un espacio de nombres existente o cree un nuevo espacio de nombres de Azure Event Hubs y una instancia de Event Hubs. La instancia de Event Hubs recibe eventos.
- Habilite el streaming de eventos de cambio para una base de datos de usuario.
- Cree un grupo de secuencias de eventos. Con este grupo, configure el destino, las credenciales, los límites de tamaño del mensaje y el esquema de creación de particiones.
- Agregue una o varias tablas al grupo de secuencias de eventos.
Cada paso se describe en detalle en las secciones siguientes de este artículo.
Prerrequisitos
Para configurar el streaming de eventos de cambio, necesita los siguientes recursos, permisos y configuración:
- Espacio de nombres de Azure Event Hubs
- Instancia de Event Hubs de Azure
- Nombre de host de Azure Event Hubs
- Un inicio de sesión en el rol db_owner o que tenga el permiso CONTROL DATABASE para la base de datos donde tiene la intención de habilitar CES.
- Para SQL Server 2025 (17.x), habilite la configuración de ámbito de la base de datos de características en versión preliminar. Azure SQL Database no requiere esta configuración.
- En el caso de Azure SQL Database configurado para usar reglas de firewall de salida o un perímetro de seguridad de red, permita el acceso a Azure Event Hubs de destino:
Configuración de Azure Event Hubs
Para aprender a crear Azure Event Hubs, consulte Creación de un centro de eventos mediante Azure Portal.
Control de acceso de Azure Event Hubs
Configure el control de acceso para el recurso de SQL en Azure Event Hubs. La autenticación de Microsoft Entra es el método más seguro, pero actualmente solo es compatible con Azure SQL Database para CES. Aunque el uso de una directiva de acceso compartido es compatible con Azure SQL Database y SQL Server 2025, úselo solo en Azure SQL Database si la autenticación de Microsoft Entra no es una opción.
- Control de acceso compartido basado en directivas de acceso
- Control de acceso basado en Microsoft Entra
Las directivas de acceso compartido proporcionan autenticación y autorización a Azure Event Hubs. Cada directiva de acceso compartido necesita un nombre, un nivel de acceso (Manage, Sendo Listen) y un enlace de recursos (espacio de nombres de Event Hubs o una instancia específica del centro de eventos). Las directivas de nivel de instancia ofrecen más seguridad siguiendo el principio de privilegios mínimos. Tanto SQL Server 2025 como Azure SQL Database admiten este método. Sin embargo, use la autenticación de Microsoft Entra siempre que sea posible con Azure SQL Database, ya que proporciona una mejor seguridad.
Si usa una directiva de acceso compartido para la autenticación y autorización, los clientes que envían datos a un centro de eventos de Azure deben proporcionar el nombre de la directiva que quieren usar, junto con un token de SAS generado a partir de la directiva o la clave de servicio de la directiva.
Los tokens de SAS tienen una ventaja de seguridad sobre las claves de servicio: si el cliente está en peligro, el token de SAS solo es válido hasta que expire y el cliente en peligro no puede crear nuevos tokens de SAS. Por el contrario, las claves de servicio no expiran automáticamente. Un cliente en peligro con una clave de servicio puede generar nuevos tokens de SAS mediante la clave .
Para configurar el streaming en Azure Event Hubs con el protocolo AMQP (el protocolo nativo de Azure Event Hubs predeterminado), cree o reutilice una directiva de acceso compartido con el permiso Enviar y genere un token de SAS. Puede generar el token mediante programación con cualquier lenguaje de programación o scripting. En el ejemplo de este artículo se muestra cómo generar un token de SAS a partir de una directiva nueva o existente mediante un script de PowerShell.
Nota:
Para mejorar la seguridad, se recomienda encarecidamente usar el control de acceso basado en Microsoft Entra siempre que sea posible. Si el control de acceso basado en Microsoft Entra no es posible y usa directivas de acceso compartido, use la autenticación de token de SAS en lugar de la autenticación basada en claves de servicio siempre que sea posible. Entre los procedimientos recomendados para los tokens de SAS se incluye definir un ámbito de acceso mínimo necesario, establecer una fecha de expiración corta y rotar la clave SAS con regularidad. Para la autenticación basada en claves, gire las claves periódicamente. Almacene todos los secretos de forma segura mediante Azure Key Vault o un servicio similar.
Instalación de los módulos necesarios
Para administrar recursos de Azure Event Hubs con scripts de PowerShell, necesita los siguientes módulos:
- Módulo de Az PowerShell
- Módulo Az.EventHub de PowerShell
El siguiente script instala los módulos necesarios:
Install-Module -Name Az -AllowClobber -Scope CurrentUser -Repository PSGallery -Force
Install-Module -Name Az.EventHub -Scope CurrentUser -Force
Si ya tiene los módulos necesarios y quiere actualizarlos a la versión más reciente, ejecute el siguiente script:
Update-Module -Name Az -Force
Update-Module -Name Az.EventHub -Force
Conexión con Azure
Puede usar Azure Cloud Shell o iniciar sesión y establecer el contexto de suscripción.
Para ejecutar con Azure Cloud Shell, consulte Inicio de sesión en Azure.
Definición de una directiva
Para crear el token de SAS, necesita una directiva con derechos de envío . Puede hacer lo siguiente:
Crear una nueva directiva
O bien,
Uso de una directiva existente
Nota:
La directiva debe tener derechos de envío .
Creación de un token de SAS para una directiva nueva o existente
Al crear una nueva directiva, asegúrese de que tiene el derecho Enviar . Si usa una directiva existente, compruebe que tiene el derecho Enviar .
El script siguiente crea una nueva directiva o obtiene una existente y, a continuación, genera un token saS completo en un formato de encabezado de autorización HTTP.
Reemplace los valores entre corchetes angulares (<value>) por los valores de su entorno.
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 salida del comando anterior debe tener un aspecto similar al texto siguiente:
-- Generated SAS Token --
SharedAccessSignature sr=https%3a%2f%YourEventHubNamespace.servicebus.windows.net%2fYourEventHub&sig=xxxxxxxxxxxxxxxxxxxxxxx&se=2059133074&skn=SharedKeyNameIsHERE
-- End of generated SAS Token --
Copie el valor completo del token de SAS (la línea que comienza por SharedAccessSignature) para usarlo más adelante al configurar CES, como el ejemplo siguiente:
SharedAccessSignature sr=https%3a%2f%YourEventHubNamespace.servicebus.windows.net%2fYourEventHub&sig=xxxxxxxxxxxxxxxxxxxxxxx&se=2059133074&skn=SharedKeyNameIsHERE
Habilitación y configuración del streaming de eventos de cambio
Para habilitar y configurar el streaming de eventos de cambio, cambie el contexto de la base de datos a la base de datos de usuario y siga estos pasos:
- Si aún no está configurado, establezca la base de datos en el modelo de recuperación completa.
- Cree una clave maestra y una credencial con ámbito en la base de datos.
- Habilite el streaming de eventos.
- Cree el grupo de secuencias de eventos.
- Agregue una o varias tablas al grupo de secuencias de eventos.
En los ejemplos de esta sección se muestra cómo habilitar CES para el protocolo AMQP y el protocolo Apache Kafka:
- Transmisión a Azure Event Hubs mediante el protocolo AMQP
- Transmisión a Azure Event Hubs mediante el protocolo Apache Kafka
A continuación se muestran los valores de parámetro de ejemplo para los ejemplos de esta sección:
@stream_group_name = N'myStreamGroup'@destination_location = N'myEventHubsNamespace.servicebus.windows.net/myEventHubsInstance': este valor es el FQDN del nombre de instancia y azure Event Hubs específico.@partition_key_scheme = N'None'- (valor predeterminado) las particiones se eligen round robin. Otras opciones posibles son:-
StreamGroup: creación de particiones por el grupo de flujos -
Table: creación de particiones por tabla -
Column: creación de particiones por columnas
-
[opcional, si se usan directivas de acceso compartido a través de la clave de servicio]
- Valor de clave principal o secundaria tomado de la directiva de acceso compartido:
Secret = 'BVFnT3baC/K6I8xNZzio4AeoFt6nHeK0i+ZErNGsxiw='
- Valor de clave principal o secundaria tomado de la directiva de acceso compartido:
EXEC sys.sp_add_object_to_event_stream_group N'myStreamGroup', N'dbo.myTable'@max_message_size_kb = 256- 256 KB es el tamaño de mensaje máximo predeterminado, pero este valor debe alinearse con los límites de Azure Event Hubs de destino.
Ejemplo: Transmisión a Azure Event Hubs mediante el protocolo AMQP
Los ejemplos de esta sección muestran cómo transmitir eventos de cambio a Azure Event Hubs mediante el protocolo AMQP. AMQP es el protocolo nativo de Azure Event Hubs predeterminado.
En el ejemplo de esta sección se usa un token de SAS para autenticarse en la instancia de Azure Event Hubs mediante el protocolo AMQP. Si la autenticación de Microsoft Entra no está disponible, use un token de SAS en lugar de un valor de clave de servicio para mejorar la seguridad.
Reemplace los valores entre corchetes angulares (<value>) por los valores de su entorno.
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>'
Ejemplo: Transmisión a Azure Event Hubs mediante el protocolo Apache Kafka
En los ejemplos de esta sección se muestra cómo transmitir eventos de cambio a Azure Event Hubs mediante el protocolo Apache Kafka.
En el ejemplo de esta sección se usa un token de SAS para autenticarse en la instancia de Azure Event Hubs mediante el protocolo Apache Kafka. Si la autenticación de Microsoft Entra no está disponible, use un token de SAS en lugar de un valor de clave de servicio para mejorar la seguridad.
Reemplace los valores entre corchetes angulares (<value>) por los valores de su entorno.
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>'
Ver la configuración y función del CES
En sys.databases, is_event_stream_enabled = 1 indica que el streaming de eventos de cambio está habilitado para la base de datos.
La consulta siguiente devuelve todas las bases de datos con el streaming de eventos de cambio habilitado:
SELECT *
FROM sys.databases
WHERE is_event_stream_enabled = 1;
En sys.tables, is_replicated = 1 indica que se transmite una tabla y sp_help_change_feed_table proporciona información sobre el grupo de tablas y los metadatos de tabla para el streaming de eventos de cambio.
La consulta siguiente devuelve todas las tablas con el streaming de eventos de cambio habilitado y proporciona información de metadatos:
SELECT name,
is_replicated
FROM sys.tables;
EXECUTE sp_help_change_feed_table
@source_schema = '<schema name>',
@source_name = '<table name>';
Procedimientos almacenados ces, funciones del sistema y DMV
En la tabla siguiente se enumeran los procedimientos almacenados, las funciones del sistema y las DMV que puede usar para configurar, deshabilitar y supervisar el streaming de eventos de cambio:
| System (objeto) | Descripción |
|---|---|
|
|
|
| sys.sp_enable_event_stream | Habilita CES para la base de datos de usuario actual. |
| sys.sp_create_event_stream_group | Crea un grupo de flujos, que es una configuración de transmisión para un grupo de tablas. El grupo de secuencias también define el destino y los detalles relacionados (como la autenticación, el tamaño del mensaje, la creación de particiones). El stream_group_id se genera automáticamente y se muestra para el usuario final cuando se completa el procedimiento. |
| sys.sp_add_object_to_event_stream_group | Agrega una tabla al grupo de secuencias. |
|
|
|
| sys.sp_remove_object_from_event_stream_group | Quita una tabla del grupo de flujos. |
| sys.sp_drop_event_stream_group | Elimina el grupo de flujos. El grupo de secuencias no debe estar en uso. |
| sys.sp_disable_event_stream | Deshabilita CES para la base de datos de usuario actual. |
|
|
|
| sys.dm_change_feed_errors | Devuelve los errores de entrega. |
| sys.dm_change_feed_log_scan_sessions | Devuelve información sobre la actividad del escaneo de registros. |
| sys.sp_help_change_feed_settings | Proporciona el estado e información del streaming de eventos de cambio configurado. |
| sys.sp_help_change_feed | Supervisa la configuración actual del flujo de cambios. |
| sys.sp_help_change_feed_table_groups | Devuelve metadatos que se usan para configurar los grupos de streaming de eventos modificados. |
| sys.sp_help_change_feed_table | Proporciona el estado y la información del grupo de streaming y los metadatos de tabla para el streaming de eventos de cambio. |
Limitaciones
El streaming de eventos de cambio (CES) tiene las siguientes limitaciones:
- Azure SQL Database
- Limitaciones generales y de nivel de servidor
- Limitaciones de nivel de base de datos
- Limitaciones de nivel de tabla
- Limitaciones de nivel de columna
- Permisos en la base de datos de origen
Azure SQL Database
Se aplican las limitaciones siguientes al usar CES con Azure SQL Database:
- La depuración de eventos extendidos (xEvent) en Azure SQL Database no está disponible actualmente.
Limitaciones generales y de nivel de servidor
- CES no se admite en SQL Server 2025 (17.x) en Linux.
- CES emite eventos solo para los cambios en los datos a partir de las instrucciones DML de
INSERT,UPDATE, yDELETE. - CES no controla los cambios de esquema (operaciones DDL), lo que significa que no emite eventos para las operaciones DDL. Sin embargo, las operaciones DDL no están bloqueadas, por lo que, si las ejecuta, el esquema de eventos DML posteriores refleja la estructura de tabla actualizada. Se espera que controle correctamente los eventos con el esquema actualizado.
- Actualmente, CES no transmite datos que existen en una tabla antes de habilitar CES. Los datos existentes no se inicializarán ni se enviarán como instantáneas cuando CES está habilitado.
- Cuando JSON es el formato de salida especificado, los mensajes de eventos grandes pueden dividirse en aproximadamente 25% del tamaño máximo de mensaje configurado por grupo de secuencias. Esta limitación no se aplica al tipo de salida binario.
- Si un mensaje supera el límite de tamaño de mensaje de Azure Event Hubs, el error solo se puede observar actualmente a través de eventos extendidos. CES xEvents solo está disponible actualmente en SQL Server 2025 y no en Azure SQL Database.
- No se admite el cambio de nombre de tablas y columnas para CES. Se produce un error al cambiar el nombre de una tabla o columna. Se permiten los cambios de nombre de la base de datos.
- La autenticación de Microsoft Entra para CES no está disponible actualmente en SQL Server 2025.
Limitaciones de nivel de base de datos
- CES solo admite bases de datos configuradas con el modelo de recuperación completa.
- CES no admite bases de datos configuradas con bases de datos reflejadas de tejido para SQL Server, replicación transaccional, captura de datos modificados o Azure Synapse Link. El seguimiento de cambios se admite en las bases de datos configuradas con CES.
- CES solo puede transmitir desde bases de datos principales que se pueden escribir. Las bases de datos secundarias que forman parte de grupos de disponibilidad AlwaysOn o que usan el vínculo Instancia administrada no se pueden configurar como orígenes de streaming.
- No se puede habilitar CES en vistas ni vistas materializadas.
Limitaciones de nivel de tabla
Una tabla solo puede pertenecer a un grupo de streaming. No se puede transmitir la misma tabla a varios destinos.
Solo puede configurar tablas de usuario para CES. CES no admite tablas del sistema de streaming.
Puede configurar hasta 4096 grupos de flujos. Cada grupo de secuencias puede incluir hasta 40 000 tablas.
No se admiten las operaciones de índice en línea
Aunque CES está habilitado en una tabla, no se puede agregar ni quitar una restricción de clave principal en esa tabla.
ALTER TABLE SWITCH PARTITIONno es compatible con las tablas configuradas para CES.TRUNCATE TABLEno está soportado en tablas habilitadas para CES.CES no admite tablas que usen ninguna de las siguientes características:
- Índices de almacén de columnas en clúster
- Tablas de historial temporal o tablas de historial de libro de contabilidad
- Siempre Cifrado
- OLTP en memoria (tablas optimizadas para memoria)
- Tablas de grafos
- Tablas externas
Limitaciones de nivel de columna
- CES no admite los siguientes tipos de datos. El streaming omite las columnas de estos tipos:
- geography
- geometry
- image
- json
- rowversion / Timestamp
- sql_variant
- Mensaje de texto / ntext
- vector
- xml
- Tipos definidos por el usuario (UDT)
Permisos en la base de datos de origen
- Para seguridad de nivel de fila, CES emite cambios en todas las filas, independientemente de los permisos de usuario.
- El enmascaramiento dinámico de datos no se aplica a los datos enviados a través de CES. Los datos se transmiten sin máscara, incluso si está configurado el enmascaramiento.
- CES no emite eventos relacionados con los cambios de permisos de nivel de objeto (por ejemplo, conceder permisos a columnas específicas).