【发布时间】:2020-12-17 09:55:50
【问题描述】:
我正在尝试授予对 Gen2 Data Lake 容器上 parquet 文件的访问权限。我在容器上有所有者 RBAC,但希望限制其他用户在容器中的访问。
我的查询很简单:
SELECT
TOP 100 *
FROM
OPENROWSET(
BULK 'https://aztsworddataaipocacldl.dfs.core.windows.net/pocacl/Top/Sub/part-00006-c62926ba-c530-4ad8-87d1-cf38c67a2da3-c000.snappy.parquet',
FORMAT='PARQUET'
) AS [result]
当我运行它时,连接没有问题。我已尝试将 ACL 权限添加到文件(当然还有包含文件夹“Top”和“Sub”)。
当我的同事尝试运行 SQL 脚本时,会收到错误消息。 Failed to execute query. Error: File 'https://aztsworddataaipocacldl.dfs.core.windows.net/pocacl/Top/Sub/part-00006-c62926ba-c530-4ad8-87d1-cf38c67a2da3-c000.snappy.parquet' cannot be opened because it does not exist or it is used by another process.
NB 类似的结果也出现在 Spark 中,但结果为 403
SQL on-demand 提供了出错后following help file的链接,提示:
如果您的查询失败并显示“文件无法打开,因为它不存在或被另一个进程使用”的错误,并且您确定两个文件都存在并且它没有被另一个进程使用,这意味着 SQL on-demand无法访问该文件。 发生此问题的原因通常是您的 Azure Active Directory 身份无权访问该文件。默认情况下,按需 SQL 会尝试使用您的 Azure Active Directory 身份访问文件。要解决此问题,您需要拥有访问文件的适当权限。最简单的方法是在您尝试查询的存储帐户上授予自己“存储 Blob 数据参与者”角色。 p>
我不希望授予 Storage Blob Data Contributor 或 Storage Blob Data Reader,因为这样可以访问容器上的每个文件,而不仅仅是我希望最终用户能够查询的文件。我们发现 SSMS 连接到 parquet 外部表时也会出现同样的情况。
那么分部分:
- 这是使用 ACL 授予访问权限的正确模式,还是应该使用其他方法?
- 我应该启用存储帐户或查询/笔记本中的设置以支持 ACL 吗?*
- 鉴于我们仍处于预览阶段,ACL 是否已在 Synapse Workspace 上实施?
*我拒绝粘贴我的整个设置,因为我真的不知道什么是相关的,什么与这个问题完全无关,但当然可以提供。
【问题讨论】:
-
当您执行
CREATE DATABASE SCOPED CREDENTIAL和CREATE EXTERNAL DATA SOURCE时,您使用了哪些详细信息?例如,您是否使用了 SAS 密钥?据我了解,按需 SQL 仅提供 AAD 或 SAS 密钥访问。 -
2 点关于 1 我没有在我们的内部环境中使用创建数据库或创建外部数据源但在另一个环境中我有。我没有使用 SAS 密钥。我的印象是访问控制列表使用 AAD,这不正确吗?
-
作为更新:访问控制文档 (docs.microsoft.com/en-us/azure/storage/blobs/…) 规定: >如果您将角色分配给存储帐户级别的安全主体,则可以使用访问控制列表授予该角色安全主体提升了对特定文件和目录的访问权限。哪个角色 (docs.microsoft.com/en-us/azure/role-based-access-control/…) 最适合我设置和 ACL NB 我已经尝试过与贡献者一起进行此操作。
-
我建议使用 SAS 进行细粒度控制 - 看看 docs。如果你需要,我可以做一个例子,但它就在那里。
-
@wBob 谢谢,我会看看,这对于从 sql 按需查询 spark sql 有用吗?
标签: azure-data-lake azure-synapse