如何对无服务器 SQL 池中的同步对象设置访问控制

在 Azure Synapse Analytics 中,Spark 数据库与无服务器 SQL 池共享。 使用 Spark 创建的基于 Lake 数据库ParquetCSV 的表在无服务器 SQL 池中自动可用。 此功能允许使用无服务器 SQL 池来浏览和查询使用 Spark 池准备的数据。 在下图中,可以看到利用此功能的高级体系结构概述。 首先,Azure Synapse Pipelines 在将数据从本地(或其他)存储移到 Azure Data Lake Storage。 Spark 现在可以扩充数据并创建数据库和表,这些数据库和表将同步到无服务器 Synapse SQL。 之后,用户可以在已扩充数据之上执行即席查询,或者(例如)将其提供给 Power BI。

Enrich in Spark, serve with SQL diagram.

完全管理员访问权限 (sysadmin)

将这些数据库和表从 Spark 同步到无服务器 SQL 池后,无服务器 SQL 池中的这些外部表可用于访问相同的数据。 但是,无服务器 SQL 池中的对象是只读的,因为要保持与 Spark 池对象的一致性。 此限制使仅具有 Synapse SQL 管理员或 Synapse 管理员角色的用户可以访问无服务器 SQL 池中的这些对象。 如果非管理员用户尝试对同步数据库/表执行查询,则将收到如下错误:External table '<table>' is not accessible because content of directory cannot be listed.,不论他们是否有权访问基础存储帐户上的数据。

由于无服务器 SQL 池中的同步数据库是只读的,因此无法修改。 创建用户或授予其他权限将会失败(如果尝试)。 若要读取同步数据库,必须有服务器级的特权权限(如 sysadmin)。 使用 Azure Synapse Link for Dataverse 和 lake 数据库表时,无服务器 SQL 池中的外部表也存在此限制。

对同步数据库的非管理员访问权限

需要读取数据和创建报表的用户通常不具有完全管理员访问权限 (sysadmin)。 此类用户通常是数据分析人员,只需要使用现有表来读取和分析数据。 他们不需要创建新对象。

具有最小权限的用户应能够:

  • 连接到从 Spark 复制的数据库
  • 通过外部表选择数据,并访问基础 ADLS 数据。

执行下面的代码脚本后,将允许非管理员用户具有服务器级的权限,以连接到任何数据库。 还将允许用户查看所有架构级对象(如表或视图)中的数据。 数据访问安全性可在存储层进行管理。

-- Creating Azure AD login (same can be achieved for Azure AD app)
    CREATE LOGIN [login@contoso.com] FROM EXTERNAL PROVIDER;
    go;
    
    GRANT CONNECT ANY DATABASE to [login@contoso.com];
    GRANT SELECT ALL USER SECURABLES to [login@contoso.com];
    GO;

注意

这些语句应在 master 数据库上执行,因为这些语句都需要服务器级别权限。

创建登录名并授予权限后,用户可以在同步外部表之上运行查询。 此缓解操作也可以应用到 Microsoft Entra 安全组。

更多对象安全性可以通过特定架构进行管理,并可锁定特定架构的访问权限。 解决方法需要额外的 DDL。 对于此方案,可以创建新的无服务器数据库、架构和视图,它们将指向 ADLS 上的 Spark 表数据。

可以通过 ACL 或 Microsoft Entra 用户/组的常规存储 Blob 数据所有者/读取者/参与者角色来对存储帐户上数据的访问权限进行管理。 对于服务主体(Microsoft Entra 应用),请确保使用 ACL 设置。

注意

  • 如果要禁止在数据之上使用 OPENROWSET,可以使用DENY ADMINISTER BULK OPERATIONS to [login@contoso.com];有关详细信息,请访问 DENY 服务器权限
  • 如果要禁止使用特定架构,可以使用DENY SELECT ON SCHEMA::[schema_name] TO [login@contoso.com];有关详细信息,请访问 DENY 架构权限

后续步骤

有关详细信息,请参阅 SQL 身份验证