azure 在某些Synapse无服务器视图上授予登录SELECT,但不能在 * 整个 * Datalake上运行OPENROWSET

kuarbcqp  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(106)

在Synapse Serverless中基于SQL Server的登录,只要我运行这两个东西:

use master
GO
Create Login JustTest WITH PASSWORD='Whatever'

use somedatabase
Create User JustTest from login JustTest

字符串
现在,JustTest可以在Datalake 上运行任何OPENROWSET查询。哎呀!
对于Synapse Serverless中的基于Azure AD安全组的登录

use master
GO
Create login JustADTest FROM EXTERNAL PROVIDER

use somedatabase
Create user JustADTEST from LOGIN JustADTEST


最初它不能运行任何视图,即使我做了GRANT SELECT ON。我需要给予它使用OPENROWSET的访问权限

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL:: WorkspaceIdentity TO JustADTest


现在,它可以运行我给它访问- * 的视图以及整个数据库 * 上的OPENROWSET,与基于SQLServer的登录启动方式相同。
那么如何做到这一点呢?看起来SQLServer登录是完全禁止使用的,人们需要找到一种方法来给予基于AD的登录使用OPENROWSET,但我不确定。

8oomwypt

8oomwypt1#

在某些Synapse无服务器视图上授予登录SELECT,但不能在 * 整个 * Datalake上运行OPENROWSET
下面的命令允许用户使用scoped credential,而不是OPENROWSET

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL:: WorkspaceIdentity TO JustADTest

字符串
要使用OPENROWSET,数据库用户必须具有ADMINISTER BULK OPERATIONS权限。

GRANT ADMINISTER DATABASE BULK OPERATIONS TO <User>;


根据MS DOC,

  • 在带有DATA_SOURCEOPENROWSET中,身份验证机制在分配给引用数据源的数据库范围内的凭证中定义。如果DATA_SOURCE引用非公共的Azure存储,则需要创建数据库范围的凭据并在DATA SOURCE中引用它以允许访问存储文件。
    请确保根据您的要求创建数据源,其中文件不应从该数据源获取。
# Create Scoped credential
CREATE DATABASE SCOPED CREDENTIAL mcred
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'SAS Access Token';

# Create external data source
CREATE EXTERNAL DATA SOURCE sampledataset
WITH 
(
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://Storageaccount.blob.core.windows.net/folder1/',
    CREDENTIAL = mcred
);


上述数据源将只给予访问文件夹% 1的文件。
要限制用户选择所有视图,您可以向用户授予特定视图的权限。如果用户没有对特定视图的选择权限,他将无法在视图中使用SELECT。

GRANT SELECT ON View1 TO <user>;

tkqqtvp1

tkqqtvp12#

可能有多种方法可以做到这一点,但这是我们最终解决的方式:
根据本文:
https://www.serverlesssql.com/user-permissions-in-serverless-sql-pools-external-tables-vs-views/#Conclusion

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL:: WorkspaceIdentity TO [Your Security Group]

DENY ADMINISTER DATABASE BULK OPERATIONS TO [Your Security Group]

字符串
第一个-需要授予安全组,这样-在它选择一个对象时,它也可以读取底层数据-这是在数据湖中。
第二个-则确保安全组不能对所有内容运行OPENROWSET本身。注意:第二个,需要从master运行。使用Master;也不起作用-必须从SSMS的左上角下拉列表中选择主。
关键点- * 在Synapse Serverless中-这只适用于外部表,而不是视图 *。如果尝试第二个DENY语句,用户也将无法选择视图。因此,需要使用外部表来代替,它仍然可用。
上面的链接更详细。
我们几乎解决所有这些问题的另一种方法是-从外部数据源中删除凭据,然后进入数据湖本身并在那里删除/添加权限。这与我们设置的其他一些东西不兼容。

相关问题