You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Blob批量插入SQL Server遇文件权限/不存在错误求助

问题描述

尝试将Azure Blob存储中的平面文件批量插入SQL Server数据库,执行以下操作后报错:

  1. 创建Azure Blob与SQL Server的连接:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'XYZ' 

CREATE DATABASE SCOPED CREDENTIAL ohhyeaa 
WITH IDENTITY = 'SHARED ACCESS SIGNATURE' 
SECRET = 'access policy key from the entire container' 

IF EXISTS ( SELECT * FROM sys.external_data_sources) 
DROP EXTERNAL DATA SOURCE MyAzureBlobStorage 
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage 
WITH ( TYPE = BLOB_STORAGE, LOCATION = 'CONTAINERaccount.blob.core.windows.net/load-to-sql', CREDENTIAL= MyAzureBlobStorageCredential) 
  1. 将文件上传至load-to-sql容器的StagingFolder_DataToSQL/project/date/路径下,文件名为file.csv

  2. 执行BULK INSERT语句:

BULK INSERT [dbo].file.csv
 FROM 'StagingFolder_DataToSQL/project/date/file.csv' 
 WITH (FORMAT = 'CSV', FIRSTROW = 2, FIELDTERMINATOR = '|', 
 KEEPIDENTITY, DATA_SOURCE = 'MyAzureBlobStorage', batchsize = 300000)

报错信息:

Msg 4860, Level 16, State 1, Line 1 无法批量加载。文件"StagingFolder_DataToSQL///.csv"不存在或您没有文件访问权限。

作为服务器及目标数据库所有者,此前在其他Azure环境中该流程可正常运行,询问是否需要在Azure门户配置特定访问设置。


解决方案

1. 修复SQL配置中的名称与格式错误

  • 创建数据库范围凭据时命名为ohhyeaa,但创建外部数据源时引用的凭据是MyAzureBlobStorageCredential,两者名称不匹配会导致权限验证失败
  • LOCATION参数缺少https://前缀,格式不符合要求

修复后的外部数据源创建语句:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'XYZ';

CREATE DATABASE SCOPED CREDENTIAL ohhyeaa 
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'your-container-sas-key'; -- 注意SAS密钥开头不要带?符号

IF EXISTS (SELECT * FROM sys.external_data_sources WHERE name = 'MyAzureBlobStorage')
DROP EXTERNAL DATA SOURCE MyAzureBlobStorage;

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage 
WITH ( 
    TYPE = BLOB_STORAGE, 
    LOCATION = 'https://<your-storage-account>.blob.core.windows.net/load-to-sql', 
    CREDENTIAL = ohhyeaa -- 与创建的凭据名称保持一致
);

2. 修正BULK INSERT的目标对象

[dbo].file.csv是文件名而非SQL表名,需替换为实际的目标表名称,例如:

BULK INSERT [dbo].TargetTable
 FROM 'StagingFolder_DataToSQL/project/date/file.csv' 
 WITH (
    FORMAT = 'CSV', 
    FIRSTROW = 2, 
    FIELDTERMINATOR = '|', 
    KEEPIDENTITY, 
    DATA_SOURCE = 'MyAzureBlobStorage', 
    BATCHSIZE = 300000
);

3. 检查SAS密钥的有效性

  • 确保SAS密钥拥有读取容器/Blob的权限(至少勾选Read),且有效时间未过期
  • 确认SAS密钥开头没有多余的?符号,否则会导致权限验证失败

4. Azure门户的必要配置(针对Azure SQL Server场景)

如果使用的是Azure SQL数据库,需检查存储账户的网络设置:

  • 在存储账户的网络配置中,选择“允许从所有网络访问”,或者添加Azure SQL数据库的出站IP地址到存储账户的白名单
  • 若存储账户启用了分层命名空间(ADLS Gen2),需确认SAS权限覆盖目标文件路径,目前BULK INSERT已支持ADLS Gen2

内容的提问来源于stack exchange,提问作者Prism

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:27:32