问题描述
我正在尝试访问Gen2 Data Lake容器上的镶木地板文件。我在容器上拥有所有者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.
Spark也有类似的结果,但使用403代替
sql按需提供了错误发生后指向following help file的链接,它表明:
如果查询失败,并显示“文件无法打开,因为它不存在或被另一个进程使用,则无法打开”的错误,并且您确定两个文件都存在且未被另一个进程使用,则表示sql按需无法访问该文件。 通常会发生此问题,因为您的Azure Active Directory身份无权访问该文件。默认情况下,sql按需尝试使用您的Azure Active Directory身份访问文件。要解决此问题,您需要具有访问文件的适当权限。 最简单的方法是在您要查询的存储帐户上为自己授予“ Storage Blob数据贡献者”角色。 >
我不希望授予Storage Blob数据贡献者或Storage Blob数据读取器,因为它可以访问容器上的每个文件,而不仅仅是我希望最终用户能够查询的文件。我们发现SSMS连接到实木复合地板外部桌子时也会遇到同样的情况。
所以分部分:
- 这是使用ACL授予访问权限的正确模式,还是应该使用其他方法?
- 我应该启用存储帐户或我的查询/笔记本中的设置以支持ACL吗?*
- 鉴于我们仍处于预览状态,到目前为止,是否已在Synapse Workspace上实施了ACL?
*我一直拒绝粘贴我的整个设置,因为我真的不知道什么与该问题相关,什么完全不相关,但是当然可以提供。
解决方法
在 Azure Synapse Analytics 预览版中,ACL 功能似乎无法正常工作。
我现在已经设法让它工作了。目前我看到,一旦 Read|Execute 被提供给一个文件夹,它就允许访问该文件夹和子文件夹中包含的文件。即使没有对子文件夹中的文件提供特定的 ACL 访问权限,也可以访问。这不是我所期望的,但它足以让我继续:仅授予对 Gold 文件夹的访问权限,就可以将我想让用户查询的文件和我想隐藏的工作文件的访问分开。>
,将ACL分配给文件夹时,它不会递归传播到该文件夹内的所有文件。仅新文件从文件夹继承。
您可以看到此here