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

Posted

技术标签:

【中文标题】有没有办法从本地 Azure Blob 存储批量插入?【英文标题】:Is there a way BULK INSERT from local Azure Blob Storage? 【发布时间】:2021-04-23 14:29:30 【问题描述】:

TL;DR 我正在尝试从 Local Azure Blob Storage

将 SQL 指向 BULK INSERT

问题:

大家好,

我正在尝试将我的本地 SQL Server 数据库实例作为外部连接连接到 Blob 存储模拟器,但是我得到了 “指定的错误或无法访问的位置” em> 错误。以下是我正在采取的步骤:

我创建了以下MasterDatabaseKeyCREDENTIALS 如下:

IF EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##') 
DROP MASTER KEY;

--Create Master Key
CREATE MASTER KEY 
ENCRYPTION BY PASSWORD='MyStrongPassword';

和数据库凭据:

-- DROP DB Credentials If Exist
IF EXISTS (SELECT * FROM sys.database_credentials WHERE name = 'credentials')
DROP DATABASE SCORED CREDENTIAL credentials;

--Create scoped credentials to connect to Blob
CREATE DATABASE SCOPED CREDENTIAL credentials
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 
'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=='; --local storage key
GO

然后我创建了以下外部数据源:

CREATE EXTERNAL DATA SOURCE external_source
WITH 
(
    TYPE = BLOB_STORAGE,
    LOCATION = 'http://127.0.0.1:10000/devstoreaccount1/container/some_folder/',
    CREDENTIAL = credentials
)

但是当我运行BULK INSERT 命令时:

BULK INSERT [dbo].[StagingTable] FROM 'some_file_on_blob_storage.csv' WITH (DATA_SOURCE = 'external_source', FIRSTROW = 1, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')

但它失败并返回

Bad or inaccessible location specified in external data source "external_source".

如何将文件从本地 Blob 存储加载到 SQL Server?

【问题讨论】:

只是确认如果您将127.0.0.1:10000/devstoreaccount1/container/some_folder 插入本地浏览器,您会得到看起来“blobby”的东西......甚至是 401 错误? @Nick.McDermaid 是正确的,带有 XML 正文的 401(未经授权)。 我注意到这里的文档 docs.microsoft.com/en-us/sql/t-sql/statements/… 说 在为批量配置外部数据源时,不要在 LOCATION URL 的末尾添加尾随 /、文件名或共享访问签名参数操作。 该示例也没有尾随 /,因此请尝试将其删除。 @Nick.McDermaid 我刚刚在credential 参数中添加了一个SAS,并在文件中附加了密码。它似乎正在读取文件,但它被另一个进程锁定(显然) 【参考方案1】:

Nick.McDermaid 已正确指出错误。从您的代码和错误消息来看,错误是由错误的 LOCATION 语法引起的:

不要在结尾添加 /、文件名或共享访问签名 配置时在 LOCATION URL 末尾的参数 批量操作的外部数据源。

参考这里:https://docs.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql?view=sql-server-ver15&tabs=dedicated#examples-bulk-operations

将值更改为LOCATION = 'http://127.0.0.1:10000/devstoreaccount1/container/some_folder',应该可以解决错误。我测试过,一切正常。

对于您的另一个问题,我们无法直接回答您。我建议您在详细代码中发布另一个问题。我们都很乐意为您提供帮助。

更新:

关于你的另一个问题,我测试发现我们必须设置共享访问签名(SAS)'允许的资源类型'= 对象,然后我们才能访问容器和子文件夹以及其中的文件容器。

例如,这两个语句都运行良好。

HTH。

【讨论】:

谢谢,不幸的是它只解决了我的问题的一部分。我的用例要求在容器中读取文件夹中的文件,因此授予权限会很麻烦。 您现在是如何创建或配置 SAS 权限的? 我已将其设置为 FOLDER 级别(在容器内),不确定 SAS 是否会授予对所述文件夹的子资源的访问权限? @DylanSmyth 是的,它可以。我们需要将“允许资源类型”设置为Object。请查看我的更新。

以上是关于有没有办法从本地 Azure Blob 存储批量插入?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 Azure Blob 存储导入 AzureSQL PaaS 的方法

从 SFTP 服务器将文件上传到 Azure 存储 Blob

将多个 Blob 上传到 Azure 存储

从 Azure 存储 Blob 中批量删除“x”天前的对象

如何脱机调试 Azure Blob 存储触发器?

从 Azure Blob 存储批量插入时出现 ERRORFILE 问题