Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- SQL Server 2025 (configuração com escopo do banco de dados de recursos de versão prévia necessária).
- Banco de Dados SQL do Azure (configuração com escopo do banco de dados de recursos de versão prévia não necessária).
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:
- 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.
- Habilite o streaming de eventos de alteração para um banco de dados do usuário.
- 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.
- 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:
- Namespace dos Hubs de Eventos do Azure
- Instância dos Hubs de Eventos do Azure
- Nome do host dos Hubs de Eventos do Azure
- Um logon na função db_owner ou que tenha permissão CONTROL DATABASE para o banco de dados em que você pretende habilitar o CES.
- Para o SQL Server 2025 (17.x), habilite a configuração com escopo do banco de dados de recursos de visualização. O Banco de Dados SQL do Azure não requer essa configuração.
- Para o Banco de Dados SQL do Azure configurado para usar regras de firewall de saída ou um Perímetro de Segurança de Rede, permita o acesso aos Hubs de Eventos do Azure de destino:
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.
- Controle de acesso baseado em política de acesso compartilhado
- Controle de acesso baseado no Microsoft Entra
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:
- Se ainda não estiver configurado, defina o banco de dados como o modelo de recuperação completo.
- Crie uma chave mestra e uma credencial com escopo no banco de dados.
- Habilitar o streaming de eventos.
- Crie o grupo de fluxo de eventos.
- 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:
- Transmitir para Os Hubs de Eventos do Azure por meio do protocolo AMQP
- Transmitir para os Hubs de Eventos do Azure por meio do 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='
- Valor de chave primária ou secundária obtido da política de acesso compartilhado:
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 |
|---|---|
|
|
|
| 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. |
|
|
|
| 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. |
|
|
|
| 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
- Limitações gerais e no nível do servidor
- Limitações no nível do banco de dados
- Limitações no nível da tabela
- Limitações no nível da coluna
- Permissões no banco de dados de origem
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,UPDATEeDELETEDML. - 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
- O CES só dá suporte a bancos de dados configurados com o modelo de recuperação completo.
- O CES não dá suporte a bancos de dados configurados com Bancos de Dados Espelhados do Fabric para SQL Server, replicação transacional, captura de dados de alteração ou Link do Azure Synapse. Há suporte para controle de alterações em bancos de dados configurados com CES.
- O CES só pode transmitir de bancos de dados primários graváveis. Bancos de dados secundários que fazem parte de grupos de disponibilidade Always On ou que usam o link da Instância Gerenciada não podem ser configurados como fontes de streaming.
- Você não pode habilitar o CES em exibições ou exibições materializadas.
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 PARTITIONnão é compatível nas tabelas configuradas para CES.TRUNCATE TABLEnã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).