[英]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 無服務器上下文
我最終只使用了這樣的 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 中給出的內容,並且使用下面的代碼對我來說效果很好。
CREATE LOGIN utkarsh2 WITH PASSWORD = 'Utrolic123';
GO
CREATE USER utkarsh2 FROM LOGIN utkarsh2;
GO
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';
GRANT CREATE TABLE TO utkarsh2;
GO
GRANT ALTER ON SCHEMA::dbo TO utkarsh2;
GO
ADMINISTER DATABASE BULK OPERATIONS
權限授予用戶GRANT ADMINISTER DATABASE BULK OPERATIONS TO utkarsh2;
請遵循相同的操作,您將能夠在獲得此權限后批量插入。
我剛剛和我們的一位數據工程師聊了一會兒,我們找到了我正在尋找的解決方案。
因此,首先我們創建前面提到的CREDENTIAL
和USER
:
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.