簡體   English   中英

Azure blob 到 Azure SQL 數據庫:無法批量加載,因為無法打開文件“xxxx.csv”。 操作系統錯誤代碼 5(訪問被拒絕。)

[英]Azure blob to Azure SQL Database: Cannot bulk load because the file "xxxx.csv" could not be opened. Operating system error code 5(Access is denied.)

我正在嘗試在 azure sql 數據庫中批量加載 azure blob 存儲中的一些數據。 文件內容為:

 customer,age,gender
'C1093826151','4','M'
'C352968107','2','M'
'C2054744914','4','F'

該文件位於名為silver的容器中。 在銀色容器中,我有 File1.fmt 內容是:

14.0  
3
1       SQLCHAR       0       7       ","      1     customer       ""  
2       SQLCHAR       0       100     ","      2     age            SQL_Latin1_General_CP1_CI_AS 
3       SQLCHAR       0       100     "\r\n"   3     gender         SQL_Latin1_General_CP1_CI_AS

我有額外的行添加 fmt 文件的末尾。

我創建了一個 SAS 令牌,將全部啟用並允許,如下面的屏幕截圖所示: 在此處輸入圖像描述

datalake上的防火牆規則如下圖:

在此處輸入圖像描述

下面是我的 sql 腳本(我刪除了 SAS 令牌開頭的?,因為我的銀容器是公開的,我知道我應該需要 SAS 令牌):

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'safepassword';
go
DROP EXTERNAL DATA SOURCE MyAzureInvoices

DROP DATABASE SCOPED CREDENTIAL UploadInvoices

CREATE DATABASE SCOPED CREDENTIAL UploadInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sv=2019-12-12**********************************88%3D'; -- dl

--DROP EXTERNAL DATA SOURCE MyAzureInvoices

CREATE EXTERNAL DATA SOURCE MyAzureInvoices
    WITH (
        TYPE = BLOB_STORAGE,
        LOCATION = 'https://mydatalake.blob.core.windows.net/silver',
        CREDENTIAL = UploadInvoices
    );

着陸表:

CREATE TABLE [ext].[customer](
    [customer_id] [int] IDENTITY(1,1) NOT NULL,
    [customer] [varchar](100) NOT NULL,
    [age] [int] NOT NULL,
    [gender] [varchar](50) NOT NULL
) ON [PRIMARY]
GO

這些是我嘗試將文件加載到 sql 數據庫的方法:

-- 1
    SELECT * FROM OPENROWSET(
   BULK 'bs140513_032310-demo.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   FORMAT = 'CSV',
   FORMATFILE='File1.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
   ) AS DataFile;   
-- 2    
    go
    SELECT * FROM OPENROWSET(
   BULK 'bs140513_032310-demo.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   SINGLE_CLOB) AS DataFile;
   go
-- 3
BULK INSERT ext.customer
FROM 'bs140513_032310-demo.csv'
WITH (
DATA_SOURCE = 'MyAzureInvoices', FORMAT = 'CSV' );

他們都給出了同樣的錯誤:

Msg 4861, Level 16, State 1, Line 2
Cannot bulk load because the file "bs140513_032310-demo.csv" could not be opened. Operating system error code 5(Access is denied.).

我已經嘗試了 3 天,但我迷路了。 感謝您的幫助注意:

斷開連接時,它可以訪問文件:

*

mydatalake是假的,但我可以實名訪問

我認為此錯誤消息具有誤導性。
我創建了與您相同的測試,並遇到了相同的錯誤。
但是在我編輯bs140513_032310-demo.csvFile1.fmt ,它運行良好。

  1. 我像這樣更改了bs140513_032310-demo.csv 在此處輸入圖像描述

  2. 我像這樣更改了File1.fmt ,我將 cutomer長度從 7 更改為 100,將age 列長度從 100 更改為 7:

14.0  
3
1       SQLCHAR       0       100       ","      1     customer       ""
2       SQLCHAR       0       7         ","      2     age            SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100       "\r\n"   3     gender         ""
  1. 我使用如下語句查詢:
   SELECT * FROM OPENROWSET(
   BULK 'bs140513_032310-demo.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   FORMAT = 'CSV',
   FORMATFILE='File1.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
   ) AS DataFile; 

結果顯示:
在此處輸入圖像描述

  1. 不要直接將BULK INSERT 插入到您的真實表中。
  • 我總是會從 CSV 文件插入臨時表 ext.customer_Staging(沒有 IDENTITY 列)
  • 可能編輯/清理/操作您導入的數據
  • 然后使用如下 T-SQL 語句將數據復制到實際表中:
INSERT into  ext.customer_Staging with (TABLOCK) (customer, age, gender)
   SELECT * FROM OPENROWSET(
   BULK 'bs140513_032310-demo.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   FORMAT = 'CSV',
   FORMATFILE='File1.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
   ) AS DataFile;
   go

INSERT INTO ext.customer(Name, Address) 
   SELECT customer, age, gender
   FROM ext.customer_Staging

暫無
暫無

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

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