外部数据源中指定的错误或不可访问的位置
Posted
技术标签:
【中文标题】外部数据源中指定的错误或不可访问的位置【英文标题】:Bad or inaccessible location specified in external data source 【发布时间】:2020-11-05 05:25:45 【问题描述】:我正在尝试将 Azure 文件存储中的文件保存到 Azure SQL 数据库表 varbinary(max) 列(按照建议存储整个内容 in this answer)。我尝试了几次调整我的 SQL 查询,但没有成功。这是导致错误“外部数据源“my_Azure_Files”中指定的位置错误或无法访问的代码。当它调用 OPENROWSET 时:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'mypassword123'
GO
CREATE DATABASE SCOPED CREDENTIAL [https://mystorageaccount.file.core.windows.net/]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sas_token_generated_on_azure_portal';
CREATE EXTERNAL DATA SOURCE my_Azure_Files
WITH (
LOCATION = 'https://mystorageaccount.file.core.windows.net/test',
CREDENTIAL = [https://mystorageaccount.file.core.windows.net/],
TYPE = BLOB_STORAGE
);
Insert into dbo.myTable(targetColumn)
Select BulkColumn FROM OPENROWSET(
BULK 'test.csv',
DATA_SOURCE = 'my_Azure_Files',
SINGLE_BLOB) AS testFile;
CLOSE MASTER KEY;
GO
我可以通过网络浏览器使用相同的 SAS 令牌和 url 路径下载 test.csv 文件。我还能够验证凭据和外部源是否已在数据库中成功创建:
+-------------------------------------------------+------------------+-----------------------------------------------------+-------------------------+------------------+---------------------------+---------------+---------------+----------------+--------------------+----------+
| data_source_id | name | location | type_desc | type | resource_manager_location | credential_id | database_name | shard_map_name | connection_options | pushdown |
+-------------------------------------------------+------------------+-----------------------------------------------------+-------------------------+------------------+---------------------------+---------------+---------------+----------------+--------------------+----------+
| 65540 | my_Azure_Files | https://mystorageaccount.file.core.windows.net/test | BLOB_STORAGE | 05/01/1900 00:00 | NULL | 65539 | NULL | NULL | NULL | ON |
| name | principal_id | credential_id | credential_identity | create_date | modify_date | target_type | target_id | | | |
+-------------------------------------------------+------------------+-----------------------------------------------------+-------------------------+------------------+---------------------------+---------------+---------------+----------------+--------------------+----------+
| https://mystorageaccount.file.core.windows.net/ | 1 | 65539 | SHARED ACCESS SIGNATURE | 15/07/2020 13:14 | 15/07/2020 13:14 | NULL | NULL | | | |
在 Azure 门户上创建 SAS 时,我检查了所有允许的资源类型和所有允许的权限,“删除”除外。我还删除了领先的“?”从 SAS 到 SECRET 字段中使用。
我尝试了TYPE = BLOB_STORAGE
和TYPE = HADOOP
以及SINGLE_BLOB
、SINGLE_CLOB
和SINGLE_NCLOB
参数的变体。
请帮我解决我的问题。
【问题讨论】:
我尝试连接到 Azure blob 容器中的文件,而不是像我最初那样连接到 SMB 文件共享,并且它似乎可以正常工作。因此,虽然这可能是一个很好的解决方案,但我仍然很想知道为什么 SMB 文件共享不适用于 Azure SQL DB。 【参考方案1】:按照以下步骤,可以成功插入到目标表中:
-
在生成 SAS 时,请选择允许的资源类型为“容器”和“对象”:
-
复制 SAS 并使用以下命令:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password@123'
-
使用在开始时不带“?”生成的 SAS 令牌并创建 Scoped Credentials:
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential WITH IDENTITY =
'SHARED ACCESS SIGNATURE', SECRET = 'sv=2019-10-
10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
-
创建引用您的 blob 路径的外部数据源:
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
LOCATION = 'https://mystorageaccount.file.core.windows.net'
, CREDENTIAL= MyAzureBlobStorageCredential
);
-
使用 OPENROWSET 运行插入:
Insert into dbo.test(name1)
Select BulkColumn FROM OPENROWSET(
BULK 'test/test.csv',
DATA_SOURCE = 'MyAzureBlobStorage',
SINGLE_BLOB) AS testFile;
-
也可以使用批量插入:
BULK INSERT dbo.test
FROM 'test/test.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage',
FORMAT = 'CSV');
假设表 dbo.test 已经创建
【讨论】:
不工作。我对容器没有任何问题。但是连接到文件给了我同样的错误。它与定价计划有什么关系吗? 另外,我的帐户类型是存储(通用 v1)。会不会是这个原因?以上是关于外部数据源中指定的错误或不可访问的位置的主要内容,如果未能解决你的问题,请参考以下文章
并非运行配置中指定的所有数据存储(workspaceblobstore)都存在
如何将excel表格中多行的部分数据分别提取到另一表格中指定的多行固定位置?
OData 错误:URI 中指定的查询无效。该属性不能在查询选项中使用
如何使用错误消息中指定的 tbspaceid tableid 在 DB2 中查找表和列