Azure SQL:从 Blob 添加无法识别存储

Posted

技术标签:

【中文标题】Azure SQL:从 Blob 添加无法识别存储【英文标题】:Azure SQL: Adding from Blob Not Recognizing Storage 【发布时间】:2020-10-25 07:57:38 【问题描述】:

我正在尝试按照https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-ver15#f-importing-data-from-a-file-in-azure-blob-storage 中的步骤使用托管标识选项将数据从 CSV 文件加载到我的 Azure 数据库中的表中。当我运行查询时,我收到此错误: Failed to execute query. Error: Referenced external data source "adfst" not found.

这是我在存储帐户中创建的容器的名称。我也尝试过使用我的存储帐户,但出现同样的错误。查看https://docs.microsoft.com/en-us/sql/relational-databases/import-export/examples-of-bulk-access-to-data-in-azure-blob-storage?view=sql-server-ver15 并不能进一步了解可能导致问题的原因。我的存储帐户没有配置公共(匿名)访问权限。

我假设我缺少一个可以解决此问题的简单项目,但我无法弄清楚它是什么。下面是我的 SQL 查询,已修改为不包含不需要的内容。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**************';
GO
CREATE DATABASE SCOPED CREDENTIAL msi_cred WITH IDENTITY = '***********************';
CREATE EXTERNAL DATA SOURCE adfst
WITH ( TYPE = BLOB_STORAGE,
          LOCATION = 'https://**********.blob.core.windows.net/adfst'
          , CREDENTIAL= msi_cred
);
BULK INSERT [dbo].[Adventures]
FROM 'Startracker_scenarios.csv'
WITH (DATA_SOURCE = 'adfst');

【问题讨论】:

你是按照Shared Access Signature requirements创建的msi_cred吗? @AlwaysLearning 否,因为我创建了一个托管身份。 您确定支持托管标识吗?文档说您需要 SAS。 @Crowcoder 是的,从我添加的第一个链接:“访问存储帐户的另一种方法是通过托管标识。为此,请按照步骤 1 到 3 配置 SQL 数据库以通过托管访问存储身份,之后您可以实现如下代码示例”。我发布的代码基于提到的代码示例。 【参考方案1】:

如果您想在运行BULK INSERT 命令时使用托管标识访问 Azure Blob 存储。您需要为 SQL 服务器启用托管标识。否则,您将收到错误Referenced external data source "***" not found。此外,您还需要将Storage Blob Data Contributor 分配给MSI。如果不这样做,则无法访问存储在 Azure blob 中的 CVS 文件

例如

    为 SQL 服务器启用托管标识
Connect-AzAccount

#Enable MSI for SQL Server
Set-AzSqlServer -ResourceGroupName your-database-server-resourceGroup -ServerName your-SQL-servername -AssignIdentity
    通过 Azure 门户分配角色 在您的存储帐户下,导航到 Access Control (IAM),然后选择 Add role assignment。将Storage Blob Data Contributor RBAC 角色分配给已向 Azure Active Directory (AAD) 注册的服务器

    测试

    一个。数据

    1,James,Smith,19750101
    2,Meggie,Smith,19790122
    3,Robert,Smith,20071101
    4,Alex,Smith,20040202
    

    b.脚本

CREATE TABLE CSVTest
(ID INT,
FirstName VARCHAR(40),
LastName VARCHAR(40),
BirthDate SMALLDATETIME)
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword1';
GO

--> Change to using Managed Identity instead of SAS key 
CREATE DATABASE SCOPED CREDENTIAL msi_cred WITH IDENTITY = 'Managed Identity';
GO

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
          LOCATION = 'https://jimtestdiag417.blob.core.windows.net/test'
          , CREDENTIAL= msi_cred 
);
GO
BULK INSERT CSVTest
FROM 'mydata.csv'
WITH (
 FIELDTERMINATOR = ',', 
  ROWTERMINATOR = '\n', 
DATA_SOURCE = 'MyAzureBlobStorage');
GO

select * from CSVTest;
GO

【讨论】:

是的,我已经完成了所有这些;事实上,我只是又做了一遍,但我仍然遇到同样的错误。

以上是关于Azure SQL:从 Blob 添加无法识别存储的主要内容,如果未能解决你的问题,请参考以下文章

从 AKS 访问 Azure Blob 存储

有没有办法从本地 Azure Blob 存储批量插入?

Azure SQL 导出无法在 Blob 容器中备份

从 BLOB 批量插入 Azure SQL 说文件无法打开

将 Azure 数据工厂上的数据管道从 SQL Server 复制到 Blob 存储

从 Azure 存储流式传输 blob - 无法访问已关闭的流