使用托管标识设置索引器与 Azure SQL 托管实例的连接

本文介绍如何使用托管标识来设置 Azure AI 搜索索引器与 Azure SQL 托管实例的连接,而不是在连接字符串中提供凭据。

可以使用系统分配的托管标识或用户分配的托管标识(预览版)。 托管标识是 Microsoft Entra 登录名,需要 Azure 角色分配才能访问 SQL 托管实例中的数据。

在详细了解此功能之前,我们建议你了解什么是索引器以及如何为数据源设置索引器。 有关详细信息,请访问以下链接:

先决条件

分配读取数据库的权限

按照以下步骤为搜索服务系统托管标识分配读取 SQL 托管数据库的权限。

  1. 使用以下方法之一通过 SQL Server Management Studio (SSMS) 连接到 SQL 托管实例:

  2. 使用 Microsoft Entra 帐户进行身份验证。

    显示“连接到服务器”对话框的屏幕截图。

  3. 在左窗格中,找到用作数据源的 SQL 数据库进行索引,然后右键单击它。 选择“新建查询” 。

    显示新 SQL 查询的屏幕截图。

  4. 在 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 查询的屏幕截图。

如果在分配权限后又更改了搜索服务系统标识,则必须删除角色成员身份并删除 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 托管实例读取数据的权限。

  1. 在 Azure 门户中导航到 SQL 托管实例页面。

  2. 选择“访问控制 (IAM)”。

  3. 依次选择“添加”、“添加角色分配”。

    显示“访问控制”页的屏幕截图。

  4. 选择“读取者”角色。

  5. 将“分配访问权限至”保留为“Microsoft Entra 用户、组或服务主体”。

  6. 如果使用的是系统分配的托管标识,请搜索你的搜索服务,然后选择它。 如果使用的是用户分配的托管标识,请搜索用户分配的托管标识的名称,然后选择它。 选择“保存”。

    使用系统分配的托管标识的 SQL 托管实例示例:

    显示成员角色分配的屏幕截图。

创建数据源

创建数据源并提供系统分配的托管标识。

系统分配的托管标识

REST API、Azure 门户和 .NET SDK 支持系统分配的托管标识。

使用系统分配的托管标识进行连接时,对数据源定义的唯一更改是“凭据”属性的格式。 在这里,你将提供初始目录或数据库名称以及没有帐户密钥或密码的 ResourceIdResourceId 必须包含 SQL 托管实例的订阅和资源组,以及 SQL 数据库的名称。

下面的示例演示如何使用创建数据源 REST API 和托管标识连接字符串创建数据源以索引存储帐户的数据。 对于 REST API、.NET SDK 和 Azure 门户,托管标识连接字符串格式是相同的。

POST https://[service name].search.azure.cn/datasources?api-version=2024-07-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=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 }
    ]
}

创建索引器

索引器将数据源与目标搜索索引关联,并提供自动执行数据刷新的计划。 创建索引和数据源后,就已准备好创建索引器。

下面是一个带有 Azure SQL 索引器定义的创建索引器 REST API 调用。 提交请求时,索引器将开始运行。

POST https://[service name].search.azure.cn/indexers?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]

{
    "name" : "sql-mi-indexer",
    "dataSourceName" : "sql-mi-datasource",
    "targetIndexName" : "my-target-index"
}

疑难解答

如果在索引器尝试连接到表示不允许客户端访问服务器的数据源时收到错误,请参阅 常见的索引器错误

你还可以通过在有限制/无限制的情况下尝试连接来排除任何防火墙问题。

另请参阅