有没有办法从本地 Azure Blob 存储中批量插入?
Is there a way BULK INSERT from local Azure Blob Storage?
TL;DR 我正在尝试从 Local Azure Blob Storage
将 SQL 指向 BULK INSERT
问题:
大家好,
我正在尝试将我的本地 SQL 服务器数据库实例作为外部连接连接到 blob 存储模拟器,但是我收到 “错误或无法访问指定的位置 错误。以下是我正在采取的步骤:
我创建了以下 MasterDatabaseKey
和 CREDENTIALS
如下:
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')
但失败了 returns
Bad or inaccessible location specified in external data source "external_source".
如何将文件从本地 Blob 存储加载到 SQL 服务器?
Nick.McDermaid已正确指出错误。从您的代码和错误消息来看,错误是由错误的 LOCATION 语法引起的:
- 不要添加尾随 /、文件名或共享访问签名
配置时在 LOCATION URL 末尾的参数
批量操作的外部数据源。
将值改为LOCATION = 'http://127.0.0.1:10000/devstoreaccount1/container/some_folder'
,错误应该解决了。我测试过,一切正常。
关于您的另一个问题,我们无法直接回答您。我建议你 post 再问你详细的代码。我们都很乐意为您提供帮助。
更新:
关于你的另一个问题,我测试发现必须设置Shared access signature(SAS) 'Allowed resource type' = Object,才能访问container和child文件夹和容器中的文件。
例如,两种说法都适用。
HTH.
TL;DR 我正在尝试从 Local Azure Blob Storage
将 SQL 指向BULK INSERT
问题:
大家好,
我正在尝试将我的本地 SQL 服务器数据库实例作为外部连接连接到 blob 存储模拟器,但是我收到 “错误或无法访问指定的位置 错误。以下是我正在采取的步骤:
我创建了以下 MasterDatabaseKey
和 CREDENTIALS
如下:
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')
但失败了 returns
Bad or inaccessible location specified in external data source "external_source".
如何将文件从本地 Blob 存储加载到 SQL 服务器?
Nick.McDermaid已正确指出错误。从您的代码和错误消息来看,错误是由错误的 LOCATION 语法引起的:
- 不要添加尾随 /、文件名或共享访问签名 配置时在 LOCATION URL 末尾的参数 批量操作的外部数据源。
将值改为LOCATION = 'http://127.0.0.1:10000/devstoreaccount1/container/some_folder'
,错误应该解决了。我测试过,一切正常。
关于您的另一个问题,我们无法直接回答您。我建议你 post 再问你详细的代码。我们都很乐意为您提供帮助。
更新:
关于你的另一个问题,我测试发现必须设置Shared access signature(SAS) 'Allowed resource type' = Object,才能访问container和child文件夹和容器中的文件。
例如,两种说法都适用。
HTH.