是否可以从存储过程访问 Azure Blob?

Posted

技术标签:

【中文标题】是否可以从存储过程访问 Azure Blob?【英文标题】:Is it possible to access Azure Blob from a stored procedure? 【发布时间】:2020-11-29 14:48:56 【问题描述】:

我有一个存储过程,它通过网络路径访问服务器上的文件,但现在我们正在从服务器移动到 Azure Blob。是否可以通过存储过程访问 Azure Blob 上的文件?

存储过程基本上是读取服务器上的 CSV 文件,并将这些文件中的数据插入到表中。

【问题讨论】:

明确地说,您想在数据库中的存储过程中调用以从外部系统接收数据? This 建议这是可能的 - 例如此批量插入命令可帮助我们将 CSV 文件从 Blob 容器批量插入到 SQL 表中 【参考方案1】:

此功能已在 2017 年公开预览版中记录,前段时间我遇到过类似问题。

Azure SQL 数据库使您能够使用以下 SQL 语句直接加载存储在 Azure Blob 存储中的文件:

将文件从 Blob 存储帐户加载到 SQL 数据库表中的 BULK INSERT T-SQL 命令

OPENROWSET 表值函数,用于解析存储在 Blob 存储中的文件并将文件内容作为一组行返回

以下示例显示了将文件内容加载到 SQL 数据库中的 BULK INSERT 命令:

BULK INSERT Product
FROM 'data/product.dat'
WITH ( DATA_SOURCE = 'MyAzureBlobStorageAccount');

您可以使用 OPENROWSET 函数解析远程文件的内容并返回 文件中的行作为结果:

SELECT Name, Color, Price, Size, Quantity, Data, Tags
FROM OPENROWSET(BULK 'data/product.bcp', DATA_SOURCE = 'MyAzureBlobStorage',
            FORMATFILE='data/product.fmt', FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage') as products;

作为先决条件,您需要创建一个指向您的 Azure Blob 存储帐户的外部数据源。您将在 DATA_SOURCE 属性中使用此外部数据源的名称。下面是一个指向公共 Azure Blob 存储帐户的外部数据源示例:

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE, LOCATION = 
'https://myazureblobstorage.blob.core.windows.net');

如果您的 Azure Blob 存储帐户不是公共的,则需要使用 Azure 门户为该帐户生成共享访问签名 (SAS) 密钥,将 SAS 密钥放入 CREDENTIAL 中,并使用 CREDENTIAL 创建一个外部数据源,如下例所示:

CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sv=2015-12-11&ss=b&srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z&spr=https&sig=copyFromAzurePortal';


CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
   LOCATION = 'https://myazureblobstorage.blob.core.windows.net',
   CREDENTIAL= MyAzureBlobStorageCredential);

参考文献

https://azure.microsoft.com/en-us/updates/preview-loading-files-from-azure-blob-storage-into-sql-database/

https://github.com/Microsoft/sql-server-samples/tree/master/samples/features/sql-bulk-load/load-from-azure-blob-storage

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql?view=sql-server-ver15

【讨论】:

我在尝试创建外部数据源时收到Incorrect syntax near 'EXTERNAL'.。这仅与 Azure SQL 数据库兼容吗? 早上法哈尔。 Azure SQL 支持上述语句,是的,但 SQL Server 也支持,但我认为最低版本为 2017,请参阅docs.microsoft.com/en-us/sql/t-sql/statements/…

以上是关于是否可以从存储过程访问 Azure Blob?的主要内容,如果未能解决你的问题,请参考以下文章

从 webapp (azure) 访问 blob 存储

将文件从远程桌面(RDP)复制到Azure blob存储中

从 AKS 访问 Azure Blob 存储

从 Azure Function App 访问带有防火墙的 Azure Blob 存储

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

将文件数据从 Azure Blob 存储访问到变量