Compartilhar via


Configurar o streaming de eventos de alteração (versão prévia)

Aplica-se a: SQL Server 2025 (17.x) Banco de Dados SQL do Azure

Este artigo descreve como configurar o recurso ces (streaming de eventos de alteração) introduzido no SQL Server 2025 (17.x) e no Banco de Dados SQL do Azure.

Observação

O streaming de eventos de alteração está atualmente em versão prévia para:

Durante a visualização, esse recurso está sujeito a alterações. Para obter suporte atual, consulte Limitações.

Visão geral

Para configurar e usar o streaming de eventos de alteração, siga estas etapas:

  1. Use um namespace existente ou crie um novo namespace dos Hubs de Eventos do Azure e uma nova instância de Hubs de Eventos. A instância dos Hubs de Eventos recebe eventos.
  2. Habilite o streaming de eventos de alteração para um banco de dados do usuário.
  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, você precisa dos seguintes recursos, permissões e configuração:

Configurar Hubs de Eventos do Azure

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

Controle de acesso dos Hubs de Eventos do Azure

Configure o controle de acesso para o recurso SQL para os Hubs de Eventos do Azure. A autenticação do Microsoft Entra é o método mais seguro, mas atualmente só tem suporte do Banco de Dados SQL do Azure para CES. Embora o uso de uma política de acesso compartilhado seja compatível com o Banco de Dados SQL do Azure e o SQL Server 2025, use-a somente no Banco de Dados SQL do Azure se a autenticação do Microsoft Entra não for uma opção.

As políticas de acesso compartilhado fornecem autenticação e autorização aos Hubs de Eventos do Azure. Cada política de acesso compartilhado precisa de um nome, um nível de acesso (Manageou SendListen) e uma associação de recursos (namespace dos Hubs de Eventos ou uma instância específica do Hub de Eventos). As políticas de nível de instância oferecem mais segurança seguindo o princípio do privilégio mínimo. O SQL Server 2025 e o Banco de Dados SQL do Azure dão suporte a esse método. No entanto, use a autenticação do Microsoft Entra sempre que possível com o Banco de Dados SQL do Azure, pois ela fornece melhor segurança.

Se você usar uma política de acesso compartilhado para autenticação e autorização, os clientes que enviam dados para um Hub de Eventos do Azure precisarão fornecer o nome da política que desejam usar, juntamente com um token SAS gerado da política ou da 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 estiver comprometido, o token SAS só será válido até expirar e o cliente comprometido não poderá criar novos tokens SAS. Por outro lado, as chaves de serviço não expiram automaticamente. Um cliente comprometido com uma chave de serviço pode gerar novos tokens SAS usando a chave.

Para configurar o streaming para os Hubs de Eventos do Azure com o protocolo AMQP (o protocolo padrão dos Hubs de Eventos nativos do Azure), crie ou reutilize uma política de acesso compartilhado com a permissão Enviar e gere um token SAS. Você pode gerar o token programaticamente com qualquer linguagem de programação ou script. O exemplo neste artigo mostra como gerar um token SAS de uma política nova ou existente usando um script do PowerShell.

Observação

Para melhorar a segurança, é altamente recomendável usar o controle de acesso baseado no Microsoft Entra sempre que possível. Se o controle de acesso baseado no Microsoft Entra não for possível e você estiver usando políticas de acesso compartilhado, use a autenticação de token SAS em vez de autenticação baseada em chave de serviço sempre que possível. As práticas recomendadas para tokens SAS incluem definir um escopo de acesso mínimo necessário apropriado, definir uma data de validade curta e girar regularmente a chave SAS. Para autenticação baseada em chave, gire as chaves periodicamente. Armazene todos os segredos com segurança usando o Azure Key Vault ou um serviço semelhante.

Instalar os módulos necessários

Para gerenciar recursos dos Hubs de Eventos do Azure com scripts do PowerShell, você precisa dos seguintes módulos:

  • Módulo do Az PowerShell
  • Módulo do PowerShell do 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 você 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

Você pode usar o Azure Cloud Shell ou entrar e definir seu contexto de assinatura.

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

Definir uma política

Para criar o token SAS, você precisa de uma política com direitos de envio . Você pode:

  • Criar uma nova política

    Ou

  • Usar uma política existente

Observação

A política deve ter direitos de envio .

Criar token SAS para uma política nova ou existente

Ao criar uma nova política, verifique se ela tem o direito enviar . Se você usar uma política existente, verifique se ela tem o direito enviar .

O script a seguir cria uma nova política ou obtém uma existente e, em seguida, gera um token SAS completo em um formato de cabeçalho de autorização HTTP.

Substitua valores em 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 ser semelhante 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 todo o valor do token SAS (a linha que começa com SharedAccessSignature) para usá-lo mais tarde quando você configurar o CES, como o exemplo a seguir:

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 streaming 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 como o modelo de recuperação completo.
  2. Crie uma chave mestra e uma credencial com escopo no banco de dados.
  3. Habilitar 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 seção demonstram como habilitar o CES para o protocolo AMQP e o protocolo Apache Kafka:

Veja a seguir os valores de parâmetro de exemplo para os exemplos nesta seção:

  • @stream_group_name = N'myStreamGroup'

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

  • @partition_key_scheme = N'None' - As partições (padrão) são escolhidas round robin. Outras opções possíveis são:

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

    • Valor de chave primária ou secundária obtido da política de acesso compartilhado: 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 de mensagem padrão, mas esse valor deve ser alinhado com os limites dos Hubs de Eventos do Azure de destino.

Exemplo: transmitir para os Hubs de Eventos do Azure por meio do protocolo AMQP

Os exemplos nesta seção mostram como transmitir eventos de alteração para os Hubs de Eventos do Azure usando o protocolo AMQP. AMQP é o protocolo padrão de Hubs de Eventos do Azure nativo.

O exemplo nesta seção usa um token SAS para autenticar na instância dos Hubs de Eventos do Azure por meio do protocolo AMQP. Se a autenticação do 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 em 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: transmitir para os Hubs de Eventos do Azure por meio do protocolo Apache Kafka

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

O exemplo nesta seção usa um token SAS para autenticar na instância dos Hubs de Eventos do Azure por meio do protocolo Apache Kafka. Se a autenticação do 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 em 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>'

Exibir a configuração e a função do 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 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 o streaming de eventos de alteração.

A consulta a seguir retorna todas as tabelas com o streaming de evento 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 a seguir lista os procedimentos armazenados, as funções do sistema e as DMVs que você pode usar para configurar, desabilitar e monitorar o streaming de eventos de alteração:

Objeto System Descrição
Configurar o CES
sys.sp_enable_event_stream Habilita o CES para o banco de dados de usuário atual.
sys.sp_create_event_stream_group Cria um grupo de fluxo, 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 fluxo.
Desabilitar CES
sys.sp_remove_object_from_event_stream_group Remove uma tabela do grupo de fluxo de dados.
sys.sp_drop_event_stream_group Remove o grupo de fluxo. O grupo de fluxo não deve estar em uso.
sys.sp_disable_event_stream Desabilita o CES para o banco de dados de usuário atual.
Monitorar o CES
sys.dm_change_feed_errors Retorna erros de entrega.
sys.dm_change_feed_log_scan_sessions Retorna informações sobre a atividade de verificação de log.
sys.sp_help_change_feed_settings Fornece o status e as informações do streaming de evento de alteração configurado.
sys.sp_help_change_feed Monitora a configuração atual do fluxo de alterações.
sys.sp_help_change_feed_table_groups Retorna metadados usados para configurar grupos de transmissão de eventos de alteração.
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

A transmissão de eventos de mudança tem as seguintes limitações:

Banco de Dados SQL do Azure

As seguintes limitações se aplicam ao usar o CES com o Banco de Dados SQL do Azure:

  • A depuração de evento estendido (xEvent) no Banco de Dados SQL do Azure não está disponível no momento.

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

  • O CES não tem suporte no SQL Server 2025 (17.x) no Linux.
  • O CES emite eventos somente para alterações de dados nas instruções INSERT, UPDATE e DELETE DML.
  • O CES não lida com alterações de esquema (operações DDL), o que significa que ele não emite eventos para operações DDL. No entanto, as operações DDL não são bloqueadas, portanto, se você executá-las, o esquema de eventos DML subsequentes reflete a estrutura de tabela atualizada. Espera-se que você lide normalmente com os eventos com o esquema atualizado.
  • Atualmente, o CES não transmite dados que existem em uma tabela antes de o CES ser habilitado. Os dados existentes não são propagados ou enviados como um instantâneo quando o CES está habilitado.
  • Quando JSON é o formato de saída especificado, mensagens de evento grandes podem ser divididas em aproximadamente 25% do tamanho máximo de mensagem configurado por grupo de fluxo. Essa limitação não se aplica ao tipo de saída binário.
  • Se uma mensagem exceder o limite de tamanho da mensagem dos Hubs de Eventos do Azure, a falha só poderá ser observada por meio de Eventos Estendidos no momento. Atualmente, os ces xEvents estão disponíveis apenas no SQL Server 2025 e não no Banco de Dados SQL do Azure.
  • Não há suporte para renomeação de tabelas e colunas para CES. Falha ao renomear uma tabela ou coluna. Renomeações de banco de dados são permitidas.
  • A autenticação do Microsoft Entra para CES não está disponível no momento 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. Você não pode transmitir a mesma tabela para vários destinos.

  • Você só pode configurar tabelas de usuário para CES. O CES não dá suporte a tabelas do sistema de streaming.

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

  • Não há suporte para operações de índice online

  • Embora o CES esteja habilitado em uma tabela, você não pode adicionar ou descartar uma restrição de chave primária nessa tabela.

  • ALTER TABLE SWITCH PARTITION não é compatível nas tabelas configuradas para CES.

  • TRUNCATE TABLE não é suportado em tabelas habilitadas para CES.

  • O CES não dá suporte a tabelas que usam nenhum dos seguintes recursos:

    • Índice columnstore clusterizado
    • Tabelas de histórico temporal ou tabelas de histórico do razão
    • Sempre Criptografado
    • OLTP na memória (tabelas com otimização de memória)
    • Tabelas de grafos
    • Tabelas externas

Limitações no nível da coluna

  • O CES não dá suporte aos seguintes tipos de dados. O streaming ignora colunas desses tipos:
    • geography
    • geometry
    • image
    • json
    • Rowversion / Timestamp
    • sql_variant
    • Texto / ntext
    • 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 aos dados enviados por meio do CES. Os dados são transmitidos desmascarados, mesmo que a máscara esteja configurada.
  • O CES não emite eventos relacionados a alterações de permissão no nível do objeto (por exemplo, concedendo permissões a colunas específicas).