Настройка потоковой передачи событий изменений (предварительная версия)

Применимо к: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed Instance

В этой статье описывается, как настроить функцию потоковой передачи событий изменений (CES), представленную в SQL Server 2025 (17.x), Базе данных SQL Azure и Управляемом экземпляре SQL Azure.

Замечание

В настоящее время потоковая передача событий изменений доступна в предварительной версии для:

Обзор

Чтобы настроить и использовать потоковую передачу событий изменений, выполните следующие действия.

  1. Используйте существующее или создайте новое пространство имен Azure Event Hubs и экземпляр Event Hubs. Экземпляр Event Hubs принимает события.
  2. Включите потоковую передачу событий изменений для пользовательской базы данных.
  3. Создайте группу потоков событий. С помощью этой группы настройте назначение, учетные данные, ограничения размера сообщения и схему секционирования.
  4. Добавьте одну или несколько таблиц в группу потоков событий.

Каждый шаг подробно описан в следующих разделах этой статьи.

Предпосылки

Чтобы настроить потоковую передачу событий изменений, вам потребуются следующие ресурсы, разрешения и конфигурация:

При использовании потоковой передачи событий изменений с помощью управляемого экземпляра SQL Azure, экземпляр должен быть настроен в соответствии с политикой обновлений SQL Server 2025 или Always-up-to-date.

Настройка Центров событий Azure

Чтобы узнать, как создать центры событий Azure, просмотрите статью "Создание концентратора событий" с помощью портала Azure.

Управление доступом Центров событий Azure

Настройте управление доступом для SQL ресурса в Azure Event Hubs. Проверка подлинности Microsoft Entra является наиболее безопасным методом, но в настоящее время поддерживается только базой данных SQL Azure для CES. Хотя использование политики общего доступа поддерживается базой данных SQL Azure и SQL Server 2025, используйте ее только в базе данных SQL Azure, если проверка подлинности Microsoft Entra не является вариантом.

Политики общего доступа предоставляют проверку подлинности и авторизацию в Центрах событий Azure. Для каждой политики общего доступа требуется имя, уровень доступа (Manage, Send, или Listen), и привязка ресурсов (пространство имен Центров событий или определенный экземпляр Центра событий). Политики уровня экземпляра обеспечивают большую безопасность, следуя принципу наименьших привилегий. Как SQL Server 2025, так и База данных SQL Azure поддерживают этот метод. Однако при возможности используйте проверку подлинности Microsoft Entra с базой данных SQL Azure, так как она обеспечивает более высокую безопасность.

Если вы используете политику общего доступа для проверки подлинности и авторизации, клиенты, отправляя данные в Концентратор событий Azure, должны указать имя используемой политики, а также маркер SAS , созданный из политики или ключа службы политики.

Маркеры SAS имеют преимущество безопасности по сравнению с ключами службы: если клиент скомпрометирован, маркер SAS действителен только до истечения срока его действия, и скомпрометированный клиент не может создавать новые маркеры SAS. В отличие от этого, ключи службы не истекают автоматически. Скомпрометированный клиент с ключом службы может создавать новые маркеры SAS с помощью ключа.

Чтобы настроить потоковую передачу в Центры событий Azure с помощью протокола AMQP (протокола по умолчанию для Центров событий Azure), создайте или повторно используйте политику общего доступа с разрешением отправка и создайте маркер SAS. Маркер можно создавать программным способом с помощью любого языка программирования или скриптов. В примере в этой статье показано, как создать маркер SAS из новой или существующей политики с помощью скрипта PowerShell.

Замечание

Для повышения безопасности настоятельно рекомендуется использовать управление доступом на основе Microsoft Entra всегда, когда это возможно. Если управление доступом на основе Microsoft Entra невозможно и используются общие политики доступа, вместо аутентификации на основе ключа службы, по возможности, используйте аутентификацию с использованием маркера SAS. Рекомендации по маркерам SAS включают определение соответствующей минимально требуемой области доступа, настройку короткой даты окончания срока действия и регулярное поворот ключа SAS. Для проверки подлинности на основе ключей периодически сменяйте ключи. Безопасно храните все секреты с помощью Azure Key Vault или аналогичной службы.

Установка необходимых модулей

Чтобы управлять ресурсами Центров событий Azure с помощью скриптов PowerShell, вам потребуется следующее:

  • Модуль Az PowerShell
  • Модуль Az.EventHub PowerShell

Следующий скрипт устанавливает необходимые модули:

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

Если у вас уже есть необходимые модули и хотите обновить их до последней версии, выполните следующий сценарий:

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

Подключение к Azure

Вы можете использовать Azure Cloud Shell или войти и задать контекст подписки.

Чтобы запустить Azure Cloud Shell, просмотрите вход в Azure.

Определение политики

Чтобы создать маркер SAS, вам потребуется политика с правами отправки . Вы можете сделать одно из двух:

  • Создание новой политики

    или

  • Использование существующей политики

Замечание

Политика должна иметь права на отправку .

Создание маркера SAS для новой или существующей политики

При создании новой политики убедитесь, что она имеет право на отправку. Если вы используете существующую политику, убедитесь, что она имеет право отправки.

Следующий скрипт создает новую политику или получает существующую, а затем создает полный маркер SAS в формате заголовка авторизации HTTP.

Замените значения в угловых скобках (<value>) значениями для вашей среды.

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

Выходные данные предыдущей команды должны выглядеть следующим образом:

-- Generated SAS Token --
SharedAccessSignature sr=https%3a%2f%YourEventHubNamespace.servicebus.windows.net%2fYourEventHub&sig=xxxxxxxxxxxxxxxxxxxxxxx&se=2059133074&skn=SharedKeyNameIsHERE
-- End of generated SAS Token --

Скопируйте все значение маркера SAS (строка, которая начинается с SharedAccessSignature), чтобы использовать его позже при настройке CES, например в следующем примере:

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

Включение и настройка потоковой передачи событий изменений

Чтобы включить и настроить потоковую передачу событий изменений, измените контекст базы данных на пользовательную базу данных и выполните следующие действия.

  1. Если она еще не настроена, задайте для базы данных полную модель восстановления.
  2. Создайте мастер-ключ и учетные данные с ограничением на уровень базы данных.
  3. Включите потоковую передачу событий.
  4. Создайте группу потоков событий.
  5. Добавьте одну или несколько таблиц в группу потоков событий.

В примерах этого раздела показано, как включить CES для протокола AMQP и протокола Apache Kafka:

Ниже приведены примеры значений параметров для примеров в этом разделе:

  • @stream_group_name = N'myStreamGroup'

  • @destination_location = N'myEventHubsNamespace.servicebus.windows.net/myEventHubsInstance' — это полное доменное имя (FQDN) конкретных Центров событий Azure и название экземпляра.

  • @partition_key_scheme = N'None' — (по умолчанию) разделы выбираются через цикл. Другие возможные варианты:

    • StreamGroup — секционирование по группе потоков
    • Table — секционирование по таблице
    • Column — секционирование по столбцам
  • [необязательно, если используются политики общего доступа с помощью ключа службы]

    • Значение первичного или вторичного ключа, полученное из политики общего доступа: Secret = 'BVFnT3baC/K6I8xNZzio4AeoFt6nHeK0i+ZErNGsxiw='
  • EXEC sys.sp_add_object_to_event_stream_group N'myStreamGroup', N'dbo.myTable'

  • @max_message_size_kb = 256 — 256 КБ — это максимальный размер сообщения по умолчанию, но это значение должно быть согласовано с ограничениями целевых Центров событий Azure.

Пример: Потоковая передача данных в Центры событий Azure через протокол AMQP

В примерах этого раздела показано, как передавать события изменения в Центры событий Azure с помощью протокола AMQP. AMQP — это собственный протокол Центров событий Azure по умолчанию.

В данном разделе используется токен SAS для аутентификации вашего экземпляра Центров событий Azure через протокол AMQP. Если проверка подлинности Microsoft Entra недоступна, используйте маркер SAS вместо значения ключа службы для повышения безопасности.

Замените значения в угловых скобках (<value>) значениями для вашей среды.

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

Пример. Потоковая передача в Центры событий Azure с помощью протокола Apache Kafka

В примерах этого раздела показано, как передавать события изменения в Центры событий Azure с помощью протокола Apache Kafka.

В этом разделе используется токен SAS для аутентификации к вашему экземпляру Azure Event Hubs с помощью протокола Apache Kafka. Если проверка подлинности Microsoft Entra недоступна, используйте маркер SAS вместо значения ключа службы для повышения безопасности.

Замените значения в угловых скобках (<value>) значениями для вашей среды.

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

Просмотр конфигурации и функции CES

В sys.databasesis_event_stream_enabled = 1 указывает, что потоковая передача событий изменений включена для базы данных.

Следующий запрос возвращает все базы данных с включенной потоковой передачей событий изменений:

SELECT *
FROM sys.databases
WHERE is_event_stream_enabled = 1;

В sys.tablesis_replicated = 1 означает, что таблица передается в поток, а sp_help_change_feed_table предоставляет информацию о группе таблиц и метаданных таблицы для потоковой передачи событий изменений.

Следующий запрос возвращает все таблицы с включенной потоковой передачей событий изменений и предоставляет сведения о метаданных:

SELECT name,
       is_replicated
FROM sys.tables;

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

Хранимые процедуры CES, системные функции и динамические административные представления

В следующей таблице перечислены хранимые процедуры, системные функции и динамические административные представления, которые можно использовать для настройки, отключения и отслеживания потоковой передачи событий изменений:

Системный объект Описание
Настройка CES
sys.sp_enable_event_stream Включает CES для текущей пользовательской базы данных.
sys.sp_create_event_stream_group Создает группу потоков, которая является конфигурацией потоковой передачи для группы таблиц. Группа потоков также определяет назначение и связанные сведения (например, проверку подлинности, размер сообщения, секционирование). Stream_group_id автоматически создается и отображается для конечного пользователя после завершения процедуры.
sys.sp_add_object_to_event_stream_group Добавляет таблицу в группу потоков.
Отключение CES
sys.sp_remove_object_from_event_stream_group Удаляет таблицу из группы потоков.
sys.sp_drop_event_stream_group Удаляет группу потоков. Группа потоков не должна использоваться.
sys.sp_disable_event_stream Отключает CES для текущей пользовательской базы данных.
Мониторинг CES
sys.dm_change_feed_errors Возвращает ошибки при доставке.
sys.dm_change_feed_log_scan_sessions Возвращает информацию об активности сканирования логов.
sys.sp_help_change_feed_settings Предоставляет состояние и сведения о настроенной потоковой передаче событий изменений.
sys.sp_help_change_feed Отслеживает текущую конфигурацию потока изменений.
sys.sp_help_change_feed_table_groups - системная сохранённая процедура для работы с группами таблиц в ленте изменений Возвращает метаданные, используемые для настройки групп потоковой передачи событий изменений.
sys.sp_help_change_feed_table Предоставляет состояние и сведения о потоковой группе и метаданных таблицы для потоковой передачи событий изменений.

Рост журнала транзакций

Так как доставка сообщений гарантируется, журнал транзакций для базы данных, включающей CES, может продолжать расти. Усечение журнала не допускается до тех пор, пока из журнала транслируются изменения CES. После того как размер журнала транзакций достигает максимального предела, запись в базу данных завершается неудачей.

Чтобы предотвратить это в Базе данных SQL Azure и Управляемом экземпляре SQL Azure, если размер журнала транзакций приближается к максимальному заданному пределу, корпорация Майкрософт может отключить CES или убить длительные транзакции. Для неуправляемых экземпляров SQL Server, таких как локальные среды или SQL Server на виртуальных машинах Azure, вы несете ответственность за мониторинг размера журнала транзакций и гарантируете, что он не достигает максимального определенного предела, а также вручную отключаете CES или завершаете длительные транзакции при необходимости.

После отключения CES или завершения длительной транзакции журнал транзакций обрезан для освобождения пространства. Вы должны вручную включить CES после отключения или повторить любые долго выполняющиеся транзакции, которые были завершены. Изменения данных, внесенные при отключении CES, не записываются. Передаются только изменения, внесенные после перезапуска CES.

Ниже приведен список типичных сценариев, которые могут привести к росту журнала транзакций с включенным CES:

  • Постоянные ошибки. CES повторно пытается отправить сообщение, которое неоднократно отклоняется, и не может продолжить работу. Причины постоянных ошибок, которые могут привести к отклоненным сообщениям, включают:
    • Проблемы с сетью или неправильная конфигурация.
    • Неправильная настройка учетных данных.
    • Неправильно настроен максимальный размер сообщения, отклоняемый назначением.
  • Назначение регулирует входящие события. Например, ограничения скорости Центров событий Azure зависят от типа SKU.
  • Длительные транзакции, которые создают много записей журналов и предотвращают усечение журнала.

Чтобы обеспечить бесперебойную работу, регулярно отслеживайте размер журнала транзакций и ошибок доставки CES.

Производительность

В SQL Server, управляемом экземпляре SQL Azure и эластичных пулах базы данных SQL Azure можно включить CES в нескольких базах данных. Каждая база данных с поддержкой CES потребляет ресурсы сервера и конкурирует с другой рабочей нагрузкой сервера. Убедитесь, что сервер достаточно ресурсен для ожидаемой рабочей нагрузки и регулярно отслеживает производительность сервера и баз данных.

Ограничения

Потоковая передача событий изменений (CES) имеет следующие ограничения:

База данных SQL Azure

Следующие ограничения применяются при использовании CES с базой данных SQL Azure:

  • Отладка расширенного события (xEvent) в Базе данных SQL Azure в настоящее время недоступна.

Ограничения уровня сервера и общие ограничения

  • CES не поддерживается в SQL Server 2025 (17.x) в Linux.
  • CES выдает события только для изменений данных из INSERT, UPDATE и DELETE инструкций DML.
  • CES не обрабатывает изменения схемы (операции DDL), что означает, что он не выдает события для операций DDL. Однако операции DDL не блокируются, поэтому при их выполнении схема последующих событий DML отражает обновленную структуру таблицы. Ожидается, что вы будете корректно обрабатывать события с обновленной схемой.
  • В настоящее время CES не передает данные, существующие в таблице до включения CES. Существующие данные не заполняются или отправляются в виде моментального снимка при включении CES.
  • Если сообщение превышает ограничение размера сообщения Центров событий Azure, то сбой в настоящее время наблюдается только с помощью расширенных событий. В настоящее время ceS xEvents доступны только в SQL Server 2025, а не в Базе данных SQL Azure.
  • Переименование таблиц и столбцов, настроенных для CES, не поддерживается. Переименование таблицы или столбца завершается ошибкой. Разрешены переименования базы данных.
  • Проверка подлинности Microsoft Entra для CES в настоящее время недоступна в SQL Server 2025.
  • CES недоступна для Управляемого экземпляра SQL Azure, настроенного с политикой обновления SQL Server 2022. Он доступен только для экземпляров, настроенных с помощью политики обновления SQL Server 2025 или Always-up-to-date.

Ограничения уровня базы данных

Ограничения на уровне таблицы

  • Таблица может принадлежать только одной группе потоковой передачи. Вы не можете транслировать одну таблицу в несколько мест назначения.

  • Вы можете настроить только пользовательские таблицы для CES. CES не поддерживает таблицы системы потоковой передачи.

  • Можно настроить до 4 096 групп потоков. Каждая группа потоков может включать до 40 000 таблиц.

  • Хотя CES включен в таблице, вы не можете добавить или удалить ограничение первичного ключа в этой таблице.

  • ALTER TABLE SWITCH PARTITION не поддерживается в таблицах, настроенных для CES.

  • TRUNCATE TABLE не поддерживается в таблицах, активированных для CES.

  • CES не поддерживает таблицы, использующие какие-либо из следующих функций:

    • Кластеризованные индексы Columnstore
    • Временные таблицы журнала или таблицы журнала реестра
    • Всегда зашифровано
    • OLTP в памяти (оптимизированные для памяти таблицы)
    • Таблицы графов
    • Внешние таблицы

Это важно

Операции с индексами в Сети могут создавать значительные объемы записей журнала транзакций. CES должен обрабатывать значительно больше данных, что может привести к увеличению задержки событий.

Ограничения на уровне столбцов

  • CES не поддерживает следующие типы данных. Потоковая передача пропускает столбцы следующих типов:
    • geography
    • geometry
    • image
    • json
    • rowversion / метка времени
    • sql_variant
    • СМС / ntext
    • vector
    • xml
    • Определяемые пользователем типы (UDT)

Разрешения в исходной базе данных и местонахождении данных

  • Для обеспечения безопасности на уровне строк CES выдает изменения со всех строк независимо от разрешений пользователя.
  • Динамическое маскирование данных не применяется к данным, отправленным через CES. Данные передаются в поток без маскировки, даже если настроена маскировка.
  • CES не выдает события, связанные с изменениями разрешений на уровне объекта (например, предоставление разрешений определенным столбцам).
  • CES передает данные в настроенную точку назначения, если она позволяет конфигурации сети. Если назначение находится в другом регионе, CES передает данные между регионами. Убедитесь, что это соответствует требованиям к местоположению данных и соблюдению нормативных требований.

Сеть или подключение

  • В настоящее время CES может передаваться только в общедоступные конечные точки Центров событий Azure. Конечные точки службы и частные конечные точки в настоящее время не поддерживаются.