本文介绍如何使用托管标识设置到 SQL 托管实例 的 Azure AI 搜索索引器连接,而不是在连接字符串中提供凭据。
可以使用系统分配的托管标识或用户分配的托管标识(预览版)。 托管身份是 Microsoft Entra 身份,需要 Azure 角色分配才能访问 SQL 托管实例中的数据。
在详细了解此功能之前,我们建议你了解什么是索引器以及如何为数据源设置索引器。 有关详细信息,请参阅以下链接:
先决条件
为搜索服务创建托管标识。
Microsoft Entra 管理员角色在 SQL 托管实例中:
若要在 SQL 托管实例上分配读取权限,必须是具有 SQL 托管实例的 Azure 全局管理员。 请参阅 使用 SQL 托管实例配置和管理Microsoft Entra 身份验证 ,并按照步骤预配 Microsoft Entra 管理员(SQL 托管实例)。
在 SQL 托管实例中配置公共终结点和网络安全组 ,以允许来自 Azure AI 搜索的连接。 目前不支持使用托管标识时通过共享专用链接进行连接。
分配读取数据库的权限
按照以下步骤分配搜索服务系统托管标识权限来读取 SQL 托管数据库。
使用以下方法之一通过 SQL Server Management Studio(SSMS)连接到 SQL 托管实例:
使用 Microsoft Entra 帐户进行身份验证。
在左窗格中,找到用作数据源的 SQL 数据库进行索引,然后右键单击它。 选择“新建查询”。
在 T-SQL 窗口中,复制以下命令,并包含搜索服务名称周围的括号。 选择“执行”。
CREATE USER [insert your search service name here or user-assigned managed identity name] FROM EXTERNAL PROVIDER; EXEC sp_addrolemember 'db_datareader', [insert your search service name here or user-assigned managed identity name];
如果在分配权限后更改搜索服务系统标识,则必须删除角色成员身份并删除 SQL 数据库中的用户,然后重复权限分配。 通过运行以下命令可以删除角色成员身份和用户:
sp_droprolemember 'db_datareader', [insert your search service name or user-assigned managed identity name];
DROP USER IF EXISTS [insert your search service name or user-assigned managed identity name];
添加角色分配
在此步骤中,为 Azure AI 搜索服务授予从 SQL 托管实例读取数据的权限。
在 Azure 门户中,导航到 SQL 托管实例页。
选择“访问控制(IAM)”。
依次选择“添加”、“添加角色分配”。
选择 “读取者 ”角色。
将 访问权限分配 保留为 Microsoft Entra 用户、组或服务主体。
如果您使用系统分配的托管标识,请查找您的搜索服务,然后选择该服务。 如果使用用户分配的托管标识,请搜索用户分配的托管标识的名称,然后选择它。 选择“保存”。
使用系统分配的托管标识的 SQL 托管实例示例:
创建数据源
创建数据源并提供系统分配的托管标识。
系统分配的托管标识
REST API、Azure 门户和 .NET SDK 支持系统分配的托管标识。
使用系统分配的托管标识进行连接时,对数据源定义的唯一更改是“凭据”属性的格式。 您提供初始目录或数据库名称,但 ResourceId 不含任何帐户密钥或密码。
ResourceId 必须包括 SQL 托管实例的订阅 ID、资源组,以及 SQL 数据库的名称。
下面的示例演示如何使用创建数据源 REST API 和托管标识连接字符串创建数据源以索引存储帐户的数据。 对于 REST API、.NET SDK 和 Azure 门户,托管标识连接字符串格式是相同的。
POST https://[service name].search.azure.cn/datasources?api-version=2025-09-01
Content-Type: application/json
api-key: [admin key]
{
"name" : "sql-mi-datasource",
"type" : "azuresql",
"credentials" : {
"connectionString" : "Database=[SQL database name];ResourceId=/subscriptions/[subscription ID]/resourcegroups/[resource group name]/providers/Microsoft.Sql/managedInstances/[SQL Managed Instance name];Connection Timeout=100;"
},
"container" : {
"name" : "my-table"
}
}
创建索引
索引指定文档、属性和其他构造中可以塑造搜索体验的字段。
下面是一个带有可搜索的 字段的booktitle REST API 调用:
POST https://[service name].search.azure.cn/indexes?api-version=2025-09-01
Content-Type: application/json
api-key: [admin key]
{
"name" : "my-target-index",
"fields": [
{ "name": "id", "type": "Edm.String", "key": true, "searchable": false },
{ "name": "booktitle", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false }
]
}
创建索引器
索引器将数据源与目标搜索索引关联,并提供自动执行数据刷新的计划。 创建索引和数据源后,就已准备好创建索引器。
下面是一个带有 Azure SQL 索引器定义的创建索引器 REST API 调用。 提交请求时,索引器将开始运行。
POST https://[service name].search.azure.cn/indexers?api-version=2025-09-01
Content-Type: application/json
api-key: [admin key]
{
"name" : "sql-mi-indexer",
"dataSourceName" : "sql-mi-datasource",
"targetIndexName" : "my-target-index"
}