你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用托管标识设置到 Azure SQL 的索引器连接
本文说明了如何使用托管标识设置到 Azure SQL 数据库的索引器连接,而不是在连接字符串中提供凭据。
可以使用系统分配的托管标识或用户分配的托管标识(预览版)。 托管标识是 Microsoft Entra 登录名,需要 Azure 角色分配才能访问 Azure SQL 中的数据。
先决条件
为搜索服务创建托管标识。
在 SQL 上分配 Azure 管理员角色。 索引器连接上使用的标识需要读取权限。 要分配对数据库的读取权限,你必须是 SQL 数据库或 SQL 托管实例中服务器的 Microsoft Entra 管理员。
1 - 分配读取数据库的权限
按照以下步骤分配读取数据库的搜索服务或用户分配的托管标识权限。
连接到 Visual Studio。
使用 Microsoft Entra 帐户进行身份验证。
执行以下命令:
在搜索服务名称或用户分配的托管标识名称周围使用括号。
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];
2 - 添加角色分配
在此部分,你将授予 Azure AI 搜索服务从 SQL Server 读取数据的权限。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色。
在 Azure 门户中导航到 Azure SQL Server 页。
选择“访问控制 (IAM)”。
选择“添加”>“添加角色分配”。
在“角色”选项卡上,选择相应的“读取者”角色。
在“成员”选项卡上,选择“托管标识”,然后选择“选择成员”。
选择 Azure 订阅。
如果使用的是系统分配的托管标识,请选择系统分配的托管标识,搜索你的搜索服务,然后选择它。
否则,如果使用的是用户分配的托管标识,请选择“用户分配的托管标识”,搜索用户分配的托管标识的名称,然后选择它。
在“查看 + 分配”选项卡上,选择“查看 + 分配”,以分配角色 。
3 - 创建数据源
创建数据源并提供系统分配的托管标识或用户分配的托管标识(预览版)。
系统分配的托管标识
REST API、Azure 门户和 .NET SDK 支持系统分配的托管标识。
使用系统分配的托管标识进行连接时,对数据源定义的唯一更改是“凭据”属性的格式。 你将提供初始目录或数据库名称,以及一个没有帐户密钥或密码的 ResourceId。 ResourceId 必须包含 Azure SQL Database 的订阅 ID、SQL 数据库的资源组和 SQL 数据库的名称。
下面的示例演示如何使用创建数据源 REST API 和托管标识连接字符串创建数据源以索引存储帐户的数据。 对于 REST API、.NET SDK 和 Azure 门户,托管标识连接字符串格式是相同的。
POST https://[service name].search.windows.net/datasources?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]
{
"name" : "sql-datasource",
"type" : "azuresql",
"credentials" : {
"connectionString" : "Database=[SQL database name];ResourceId=/subscriptions/[subscription ID]/resourceGroups/[resource group name]/providers/Microsoft.Sql/servers/[SQL Server name];Connection Timeout=30;"
},
"container" : {
"name" : "my-table"
}
}
用户分配的托管标识(预览版)
2021-04-30-preview 及更高版本的 REST API 支持基于用户分配的托管标识的连接。 使用用户分配的托管标识进行连接时,对数据源定义进行了两项更改:
首先,“凭据”属性的格式是初始目录或数据库名称,以及一个没有帐户密钥或密码的 ResourceId。 ResourceId 必须包含 Azure SQL Database 的订阅 ID、SQL 数据库的资源组和 SQL 数据库的名称。 这与系统分配的托管标识的格式相同。
其次,添加一个包含用户分配的托管标识的“标识”属性。 创建数据源时,只应提供一个用户分配的托管标识。 将其设置为类型“userAssignedIdentities”。
下面的示例演示了如何使用用于创建或更新数据源的最新预览版 API 版本创建索引器数据源对象:
POST https://[service name].search.windows.net/datasources?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [admin key]
{
"name" : "sql-datasource",
"type" : "azuresql",
"credentials" : {
"connectionString" : "Database=[SQL database name];ResourceId=/subscriptions/[subscription ID]/resourceGroups/[resource group name]/providers/Microsoft.Sql/servers/[SQL Server name];Connection Timeout=30;"
},
"container" : {
"name" : "my-table"
},
"identity" : {
"@odata.type": "#Microsoft.Azure.Search.DataUserAssignedIdentity",
"userAssignedIdentity" : "/subscriptions/[subscription ID]/resourcegroups/[resource group name]/providers/Microsoft.ManagedIdentity/userAssignedIdentities/[managed identity name]"
}
}
4 - 创建索引
索引指定文档、属性和其他构造中可以塑造搜索体验的字段。
下面是一个带有可搜索的 booktitle
字段的创建索引 REST API 调用:
POST https://[service name].search.windows.net/indexes?api-version=2024-07-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 }
]
}
5 - 创建索引器
索引器将数据源与目标搜索索引关联,并提供自动执行数据刷新的计划。 创建索引和数据源后,便可以准备创建索引器。 如果索引器成功,则表明连接语法和角色分配有效。
下面是一个带有 Azure SQL 索引器定义的创建索引器 REST API 调用。 提交请求时,索引器将开始运行。
POST https://[service name].search.windows.net/indexers?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]
{
"name" : "sql-indexer",
"dataSourceName" : "sql-datasource",
"targetIndexName" : "my-target-index"
}
如果在索引器尝试连接数据源时出现错误,指出不允许客户端访问服务器,请查看常见索引器错误。