我一直在尝试运行下面的脚本来从 azure blob 存储中读取文件。
--------------------------------------------
--CREATING CREDENTIAL
-- --------------------------------------------
--------------------------------------------
--shared access signature
-- --------------------------------------------
CREATE DATABASE SCOPED CREDENTIAL dlcred
with identity='SHARED ACCESS SIGNATURE',
SECRET = 'sv=2018-03-28&ss=bfqt&srt=sco&sp=rwdlacup&se=2019-12-01T07:28:58Z&st=2019-08-31T23:28:58Z&spr=https,http&sig=<signature from storage account>';
--------------------------------------------
--CREATING SOURCE
--------------------------------------------
CREATE EXTERNAL DATA SOURCE datalake
WITH (
TYPE = BLOB_STORAGE,
LOCATION='https://<storageaccount>.blob.core.windows.net/<blob>',
CREDENTIAL = dlcred
);
原本,脚本工作得很好,但后来在运行下面的最后一个查询时,它开始给出以下错误--。因为无法打开文件 "test.txt",所以无法批量加载。操作系统错误代码86(指定的网络密码不正确。)
--TEST
--------------------------------------------
SELECT CAST(BulkColumn AS XML)
FROM OPENROWSET
(
BULK 'test.xml',
DATA_SOURCE = 'datalake',
SINGLE_BLOB
) as xml_import
如果我创建一个具有服务委托人或访问密钥的凭证,也会发生同样的错误.尝试了字面上的一切,并向Azure支持登录了票据,然而他们正在努力复制这个错误。
我觉得这是存储帐户和SQL服务器之外的问题--Azure有一大堆可以针对订阅激活deactivated的服务,我觉得是其中之一阻止我们成功映射存储帐户。
有人遇到过这个错误吗?如果有,你是怎么解决的?
我在微软的支持下,这个问题得到了解决。在这里的F部分,我授予Storage Blob Data Contributor对SQL Server实例的托管身份的访问权,然后使用这里的托管身份部分运行SQL语句。https:/docs.microsoft.comen-ussqlt-sqlstatementsbulk-insert-transact-sql?view=sql-server-ver15#f-importing-data-from-a-file-in-azure-blob-storage。.
保留下面的代码解决方案。
CREATE DATABASE SCOPED CREDENTIAL msi_cred WITH IDENTITY = 'Managed Identity';
GO
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/curriculum'
, CREDENTIAL= msi_cred );
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
为了做到这一点,SQL服务器实例需要为其分配一个托管身份。这可以在创建时通过 --assign-identity
旗帜。