簡體   English   中英

Sql 無服務器數據庫(Azure Synapse Analytics):您無權使用批量加載語句

[英]Sql Serverless database (Azure Synapse Analytics): You do not have permission to use the bulk load statement

我在 Sql 無服務器數據庫(Azure Synapse Analytics)中收到“您無權使用批量加載語句”。

我嘗試了各種方法無濟於事:

EXEC master..sp_addsrvrolemember @loginame = N'%username%', @rolename = N'bulkadmin'

from: 您沒有使用批量加載語句的權限

GRANT ADMINISTER BULK OPERATIONS TO username

來自: SQL 服務器 - 您沒有使用批量加載語句的權限

這些似乎都不適用於 Sql 無服務器上下文

我最終只使用了這樣的 db_owner 和 db_denydatawriter 組合:

ALTER ROLE db_owner ADD MEMBER [username]; -- owner allows bulk operations
ALTER ROLE db_denydatawriter ADD MEMBER [username]; -- deny writer in our specific case

這行得通,但是讓這個特定的用戶 db_owner 感覺不對。 有人知道更好的方法嗎?

我正在嘗試在引用增量表的VIEW上做一個簡單的SELECT (還沒有嘗試將它用於鑲木地板,但我期待相同)。 我猜 SQL Serverless 對此操作使用批量加載。

我正在使用 Function 應用程序中的System.Data.SqlClient (v5.x) 執行此操作,並帶有托管標識。 我認為這並不重要,因為這確實是 SQL 角色問題。

建議的解決方案幾乎相同。 我試過這個,但它似乎不起作用。
如前所述,我使用托管身份連接到數據庫,這可能是當前問題的原因。

授予權限的 SQL 語句工作正常,當我查詢 sys 表時,用戶似乎擁有所有正確的權限。 但是,當從 Function 應用程序執行時,我現在收到以下異常:

找不到 CREDENTIAL 'datahub_api',因為它不存在或您沒有權限。
由於綁定錯誤,無法使用視圖或 function 'HR.Employee'。”

但是,此憑據確實存在。 將我的用戶添加到 db_owner 會使異常 go 消失。

我正在使用以下內容來創建憑據:

CREATE DATABASE SCOPED CREDENTIAL [datahub_api] WITH IDENTITY='Managed Identity'

CREATE EXTERNAL DATA SOURCE "datalakehouse" WITH (

    LOCATION = '<url to datalahouse storage>',

    CREDENTIAL = datahub_api

);

用戶是這樣創建的:

CREATE USER [username] FROM EXTERNAL PROVIDER;

另外值得一提的是,我也嘗試在[HR]模式上授予更改權限。 但不要認為這是必要的,因為我認為只有在進行批量加載時某些幕后臨時表才需要此權限。 不確定這一點,所以不要引用我的話:-)

我已經嘗試了我在 Microsoft 官方文檔Bulk load data using the COPY statement 中給出的內容,並且使用下面的代碼對我來說效果很好。

  1. 首先,我在數據庫中創建了一個新用戶。
CREATE LOGIN utkarsh2 WITH PASSWORD = 'Utrolic123';
GO
CREATE USER utkarsh2 FROM LOGIN utkarsh2;
GO

在此處輸入圖像描述

  1. 列出您的用戶在無服務器數據庫中的權限
select  princ.name
,       princ.type_desc
,       perm.permission_name
,       perm.state_desc
,       perm.class_desc
,       object_name(perm.major_id)
from    sys.database_principals princ
left join
        sys.database_permissions perm
on      perm.grantee_principal_id = princ.principal_id
where name = 'utkarsh2';

在此處輸入圖像描述

  1. 確保您的用戶有權在 [dbo] 架構中創建表
GRANT CREATE TABLE TO utkarsh2;
GO
GRANT ALTER ON SCHEMA::dbo TO utkarsh2;
GO

在此處輸入圖像描述

  1. 現在您可以將ADMINISTER DATABASE BULK OPERATIONS權限授予用戶
GRANT ADMINISTER DATABASE BULK OPERATIONS TO utkarsh2;

在此處輸入圖像描述

請遵循相同的操作,您將能夠在獲得此權限后批量插入。

我剛剛和我們的一位數據工程師聊了一會兒,我們找到了我正在尋找的解決方案。

因此,首先我們創建前面提到的CREDENTIALUSER

CREATE DATABASE SCOPED CREDENTIAL [datahub_api] WITH IDENTITY='Managed Identity'

CREATE EXTERNAL DATA SOURCE "datalakehouse" WITH (

    LOCATION = '<url to datalahouse storage>',

    CREDENTIAL = datahub_api

);

CREATE USER [username] FROM EXTERNAL PROVIDER;
/*
username is the same as the function app name in our case; 
this is the name of the managed identity created by azure when creating a System Assigned Managed Identity
*/

接下來我們授予以下權限:

GRANT SELECT TO [username] ;

GRANT CONTROL ON DATABASE SCOPED CREDENTIAL :: [datahub_api] to [username];

GRANT ADMINISTER DATABASE BULK OPERATIONS TO [username];

然后我們扔了一個否認者,只是為了很好的衡量:

ALTER ROLE db_denydatawriter ADD MEMBER [username];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM