Partilhar via


Configurar alterar eventos streaming (pré-visualização)

Aplica-se a: SQL Server 2025 (17.x) Azure SQL Database

Este artigo descreve como configurar a funcionalidade de streaming de eventos de alteração (CES) introduzida no SQL Server 2025 (17.x) e na Azure SQL Database.

Observação

O streaming de eventos de mudança está atualmente em versão beta para:

  • SQL Server 2025 (configuração com escopo de base de dados que requer funcionalidades de visualização prévia).
  • Azure SQL Database (funcionalidade de pré-visualização, configuração de base de dados com âmbito não necessária).

Durante a visualização, esse recurso está sujeito a alterações. Para saber mais sobre a capacidade de suporte atual, consulte Limitações.

Visão geral

Para configurar e usar o streaming de eventos de alteração, siga estes passos:

  1. Use um namespace existente ou crie um novo namespace e uma instância de Hubs de Eventos do Azure . A instância do Event Hubs recebe eventos.
  2. Habilite o streaming de eventos de alteração para um banco de dados de usuários.
  3. Crie um grupo de fluxo de eventos. Com esse grupo, configure o destino, as credenciais, os limites de tamanho da mensagem e o esquema de particionamento.
  4. Adicione uma ou mais tabelas ao grupo de fluxo de eventos.

Cada etapa é descrita em detalhes nas seções a seguir deste artigo.

Pré-requisitos

Para configurar o streaming de eventos de alteração, precisa dos seguintes recursos, permissões e configuração:

Configurar Hubs de Eventos do Azure

Para saber como criar Hubs de Eventos do Azure, consulte Criar um hub de eventos usando o portal do Azure.

Controle de acesso do Azure Event Hubs

Configure o controlo de acesso do seu recurso SQL para os Azure Event Hubs. A autenticação Microsoft Entra é o método mais seguro, mas atualmente só é suportada pelo Azure SQL Database para CES. Embora a utilização de uma política de acesso partilhado seja suportada tanto pelo Azure SQL Database como pelo SQL Server 2025, use-a apenas no Azure SQL Database se a autenticação Microsoft Entra não for uma opção.

As políticas de acesso partilhado fornecem autenticação e autorização aos Azure Event Hubs. Cada política de acesso partilhado necessita de um nome, um nível de acesso (Manage, Send, ou Listen), e uma ligação de recurso (espaço de nomes Event Hubs ou uma instância específica de Event Hub). As políticas ao nível da instância oferecem mais segurança ao seguir o princípio do privilégio mínimo. Tanto o SQL Server 2025 como o Azure SQL Database suportam este método. No entanto, utilize a autenticação Microsoft Entra sempre que possível com a Azure SQL Database, pois proporciona melhor segurança.

Se usar uma política de acesso partilhado para autenticação e autorização, os clientes que enviam dados para um Azure Event Hub precisam de fornecer o nome da política que querem usar, juntamente com um token SAS gerado a partir da política ou a chave de serviço da política.

Os tokens SAS têm uma vantagem de segurança em relação às chaves de serviço: se o cliente for comprometido, o token SAS só é válido até expirar, e o cliente comprometido não pode criar novos tokens SAS. Em contraste, as chaves de serviço não expiram automaticamente. Um cliente comprometido com uma chave de serviço pode gerar novos tokens SAS utilizando a chave.

Para configurar o streaming para os Azure Event Hubs com o protocolo AMQP (o protocolo nativo predefinido dos Azure Event Hubs), crie ou reutilize uma política de acesso partilhado com permissão Send e gere um token SAS. Pode gerar o token programaticamente com qualquer linguagem de programação ou de script. O exemplo neste artigo mostra como gerar um token SAS a partir de uma política nova ou existente usando um script PowerShell.

Observação

Para melhorar a segurança, recomenda-se fortemente o uso de controlo de acesso baseado no Microsoft Entra sempre que possível. Se o controlo de acesso baseado no Microsoft Entra não for possível e estiveres a usar políticas de acesso partilhadas, usa autenticação por token SAS em vez da autenticação baseada em chave de serviço sempre que possível. As melhores práticas para tokens SAS incluem definir um âmbito de acesso minimamente necessário apropriado, definir uma data de expiração curta e rodar regularmente a chave SAS. Para autenticação baseada em chaves, alternar as chaves periodicamente. Armazene todos os segredos de forma segura usando o Azure Key Vault ou um serviço semelhante.

Instalar os módulos necessários

Para gerir os recursos do Azure Event Hubs com scripts PowerShell, precisa dos seguintes módulos:

  • Módulo do PowerShell Az
  • Módulo do PowerShell Az.EventHub

O script a seguir instala os módulos necessários:

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

Se já tiver os módulos necessários e quiser atualizá-los para a versão mais recente, execute o seguinte script:

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

Conectar-se ao Azure

Podes usar o Azure Cloud Shell ou iniciar sessão e definir o contexto da subscrição.

Para executar com o Azure Cloud Shell, consulte Entrar no Azure.

Definir uma política

Para criar o token SAS, precisas de uma política com direitos de envio . Pode optar por uma das seguintes opções:

  • Criar uma nova política

    Ou

  • Utilize uma apólice existente

Observação

A política deve ter direitos de Envio .

Criar token SAS para uma política nova ou existente

Quando criares uma nova apólice, certifica-te de que tem a opção Enviar corretamente. Se usar uma política existente, verifique se tem o direito de enviar.

O script seguinte cria uma nova política ou obtém uma existente, gerando depois um token SAS completo em formato de cabeçalho de autorização HTTP.

Substitua valores entre colchetes angulares (<value>) por valores para seu ambiente.

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

A saída do comando anterior deve assemelhar-se ao seguinte texto:

-- 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 o valor completo do token SAS (a linha que começa por SharedAccessSignature) para o usar mais tarde quando configurar o CES, como no seguinte exemplo:

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

Habilitar e configurar o streaming de eventos de alteração

Para habilitar e configurar o fluxo de eventos de alteração, altere o contexto do banco de dados para o banco de dados do usuário e siga estas etapas:

  1. Se ainda não estiver configurado, defina o banco de dados para o modelo de recuperação completa.
  2. Crie uma chave mestra e uma credencial com escopo de banco de dados.
  3. Habilite o streaming de eventos.
  4. Crie o grupo de fluxo de eventos.
  5. Adicione uma ou mais tabelas ao grupo de fluxo de eventos.

Os exemplos nesta secção demonstram como ativar o CES para o protocolo AMQP e o protocolo Apache Kafka:

A seguir estão os valores de parâmetros de exemplo para os exemplos nesta seção:

  • @stream_group_name = N'myStreamGroup'

  • @destination_location = N'myEventHubsNamespace.servicebus.windows.net/myEventHubsInstance' - este valor é o FQDN dos Hubs de Eventos Azure específicos e do nome da instância.

  • @partition_key_scheme = N'None' - As partições são escolhidas por padrão em um esquema de round-robin, onde a seleção alterna sistematicamente. Outras opções possíveis são:

    • StreamGroup - particionamento pelo grupo de fluxo
    • Table - particionamento por tabela
    • Column - particionamento por colunas
  • [opcional, se forem usadas políticas de Acesso Partilhado via Chave de Serviço]

    • Valor de chave primária ou secundária obtido da política de acesso partilhado: Secret = 'BVFnT3baC/K6I8xNZzio4AeoFt6nHeK0i+ZErNGsxiw='
  • EXEC sys.sp_add_object_to_event_stream_group N'myStreamGroup', N'dbo.myTable'

  • @max_message_size_kb = 256 - 256 KB é o tamanho máximo padrão da mensagem, mas este valor deve estar alinhado com os limites dos Hubs de Eventos Azure de destino.

Exemplo: Transmitir para os Hubs de Eventos Azure via protocolo AMQP

Os exemplos desta secção mostram como transmitir eventos de alteração para os Hubs de Eventos do Azure utilizando o protocolo AMQP. O AMQP é o protocolo nativo padrão dos Azure Event Hubs.

O exemplo nesta secção utiliza um token SAS para autenticar a sua instância Azure Event Hubs através do protocolo AMQP. Se a autenticação Microsoft Entra não estiver disponível, use um token SAS em vez de um valor de chave de serviço para melhorar a segurança.

Substitua valores entre colchetes angulares (<value>) por valores para seu ambiente.

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>'

Exemplo: Stream para Azure Event Hubs via o protocolo Apache Kafka

Os exemplos nesta secção mostram como transmitir eventos de alteração para os Hubs de Eventos do Azure usando o protocolo Apache Kafka.

O exemplo nesta secção utiliza um token SAS para autenticar a sua instância Azure Event Hubs através do protocolo Apache Kafka. Se a autenticação Microsoft Entra não estiver disponível, use um token SAS em vez de um valor de chave de serviço para melhorar a segurança.

Substitua valores entre colchetes angulares (<value>) por valores para seu ambiente.

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 configuração e função CES

Em sys.databases, is_event_stream_enabled = 1 indica que o streaming de eventos de alteração está habilitado para o banco de dados.

A consulta a seguir retorna todos os bancos de dados com o streaming de eventos de alteração habilitado:

SELECT *
FROM sys.databases
WHERE is_event_stream_enabled = 1;

Em sys.tables, is_replicated = 1 indica que uma tabela é transmitida e sp_help_change_feed_table fornece informações sobre o grupo de tabelas e metadados de tabela para fluxo de eventos de alteração.

A consulta a seguir retorna todas as tabelas com o streaming de eventos de alteração habilitado e fornece informações de metadados:

SELECT name,
       is_replicated
FROM sys.tables;

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

Procedimentos armazenados do CES, funções do sistema e DMVs

A tabela seguinte lista os procedimentos armazenados, funções do sistema e DMVs que pode usar para configurar, desativar e monitorizar o streaming de eventos de alteração:

Objeto do sistema Descrição
Configurar o CES
sys.sp_enable_event_stream Habilita o CES para a base de dados de utilizador atual.
sys.sp_create_event_stream_group Cria um grupo de fluxos, que é uma configuração de streaming para um grupo de tabelas. O grupo de fluxo também define o destino e os detalhes relacionados (como autenticação, tamanho da mensagem, particionamento). O stream_group_id é gerado automaticamente e exibido para o usuário final quando o procedimento é concluído.
sys.sp_add_object_to_event_stream_group Adiciona uma tabela ao grupo de fluxos.
Desativar CES
sys.sp_remove_object_from_event_stream_group Remove uma tabela do grupo de fluxos.
sys.sp_drop_event_stream_group Descarta o grupo de fluxo. O grupo de fluxo não pode estar em uso.
sys.sp_disable_event_stream Desabilita o CES para o banco de dados de usuário atual.
Monitorar CES
sys.dm_change_feed_errors Devolve erros de entrega.
sys.dm_change_feed_log_scan_sessions Fornece informações sobre a atividade de verificação de log.
sys.sp_help_change_feed_settings Fornece o estado e as informações do streaming de eventos de alteração configurados.
sys.sp_help_change_feed Monitora a configuração atual do fluxo de alterações.
sys.sp_help_change_feed_table_groups Retorna metadados que são usados para configurar grupos de eventos de mudança em streaming.
sys.sp_help_change_feed_table Fornece o status e as informações do grupo de streaming e dos metadados da tabela para o streaming de eventos de alteração.

Limitações

O streaming de eventos de alteração (CES) tem as seguintes limitações:

Base de Dados SQL do Azure

As seguintes limitações aplicam-se ao utilizar o CES com Azure SQL Database:

  • A depuração de Eventos Estendidos (xEvent) no Azure SQL Database não está disponível de momento.

Limitações gerais e ao nível do servidor

  • O CES não é suportado no SQL Server 2025 (17.x) no Linux.
  • A CES emite eventos apenas para alterações de dados de INSERT, UPDATE e DELETE instruções DML.
  • O CES não gere alterações de esquema (operações DDL), o que significa que não emite eventos para operações DDL. No entanto, as operações DDL não são bloqueadas, por isso, se as executar, o esquema dos eventos DML subsequentes reflete a estrutura de tabela atualizada. Espera-se que trates os eventos com elegância com o esquema atualizado.
  • Atualmente, o CES não transmite dados que já existem numa tabela antes de o CES estar ativado. Os dados existentes não são semeados nem enviados como instantâneos quando o CES está ativado.
  • Quando JSON é o formato de saída especificado, mensagens de eventos grandes podem ser divididas em aproximadamente 25% do tamanho máximo de mensagens configurado por grupo de fluxo. Essa limitação não se aplica ao tipo de saída binária.
  • Se uma mensagem exceder o limite de tamanho da mensagem do Azure Event Hubs, a falha só é atualmente observável através de Eventos Estendidos. Os CES xEvents estão atualmente disponíveis apenas no SQL Server 2025, e não na Azure SQL Database.
  • A renomeação de tabelas e colunas configurada para o CES não é suportada. O processo de renomeação de uma tabela ou coluna falha. São permitidas renomeações de bases de dados.
  • A autenticação Microsoft Entra para CES não está atualmente disponível no SQL Server 2025.

Limitações no nível do banco de dados

Limitações no nível da tabela

  • Uma tabela pode pertencer a apenas um grupo de streaming. Não podes transmitir a mesma tabela para múltiplos destinos.

  • Só podes configurar tabelas de utilizador para CES. A CES não suporta tabelas de streaming do sistema.

  • Você pode configurar até 4.096 grupos de fluxo. Cada grupo de fluxo pode incluir até 40.000 tabelas.

  • Operações de indexação online não são suportadas

  • Enquanto o CES está ativado numa tabela, não pode adicionar ou eliminar uma restrição de chave primária nessa tabela.

  • ALTER TABLE SWITCH PARTITION não é suportado em tabelas configuradas para CES.

  • TRUNCATE TABLE não é suportado em tabelas compatíveis com CES.

  • A CES não suporta tabelas que utilizem nenhuma das seguintes funcionalidades:

    • Índices de colunas armazenadas em cluster
    • Tabelas de histórico temporal ou tabelas de histórico contábil
    • Sempre criptografado
    • OLTP na memória (tabelas com otimização de memória)
    • Tabelas gráficas
    • Tabelas externas

Limitações no nível da coluna

  • O CES não suporta os seguintes tipos de dados. Streaming salta colunas destes tipos:
    • geography
    • geometry
    • image
    • json
    • / carimbo de data/hora da versão de linha
    • sql_variant
    • Texto / ntexto
    • vector
    • xml
    • Tipos definidos pelo usuário (UDT)

Permissões no banco de dados de origem

  • Para segurança em nível de linha, o CES emite alterações de todas as linhas, independentemente das permissões do usuário.
  • O mascaramento dinâmico de dados não se aplica a dados enviados através do CES. Os dados são transmitidos sem máscara, mesmo que o mascaramento esteja configurado.
  • O CES não emite eventos relacionados a alterações de permissão no nível do objeto (por exemplo, conceder permissões a colunas específicas).