外部数据源中指定的错误或不可访问的位置

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_STORAGETYPE = HADOOP 以及SINGLE_BLOBSINGLE_CLOBSINGLE_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 中查找表和列

ActivityTransitionRequest 中指定的活动无效

查找列表中指定的所有元素的位置