Поделиться через


Примеры массового доступа к данным в Хранилище BLOB-объектов Azure

Область применения:SQL Server 2017 (14.x) и более поздних версийБаза данных SQL AzureУправляемый экземпляр SQL Azure

Инструкции BULK INSERT и OPENROWSET могут напрямую получить доступ к файлу в хранилище Azure Blob. В следующих примерах используются данные из CSV-файла (файл данных с разделителями-запятыми) inv-2017-01-19.csv, который хранится в контейнере Week3 в учетной записи хранения newinvoices.

Все пути к контейнеру и файлам в хранилище BLOB-объектов чувствительны к регистру. В противном случае может вернуть ошибку, как показано в следующем примере:

Не удается выполнить массовую загрузку. Файл "file.csv" не существует или у вас нет прав доступа к файлам.

Создайте учетные данные

Внешний источник данных должен быть создан с учетными данными, связанными с областью базы данных, которые используют удостоверение SHARED ACCESS SIGNATURE. Чтобы создать общую подпись доступа (SAS) для учетной записи хранения, см. свойство 'Общая подпись доступа' на странице свойств учетной записи хранения в портале Azure. Дополнительные сведения о подписях общей области доступа см. в статье Предоставление ограниченного доступа к ресурсам хранилища Azure с использованием подписанных ссылок (SAS). Дополнительные сведения о полномочиях см. в разделе CREATE DATABASE SCOPED CREDENTIAL.

Создайте учетные данные с областью действия в базе данных, которые IDENTITY должны быть SHARED ACCESS SIGNATURE. Используйте маркер SAS, созданный для учетной записи хранения объектов Blob. Убедитесь, что ваш маркер SAS не имеет ведущего символа, у вас есть по крайней мере разрешение на чтение объекта, который должен быть загружен, и что период истечения срока действия действителен (все даты указаны в формате UTC).

Например:

CREATE DATABASE SCOPED CREDENTIAL UploadInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = 'sv=2018-03-28&ss=b&srt=sco&sp=rwdlac&se=2019-08-31T02:25:19Z&st=2019-07-30T18:25:19Z&spr=https&sig=KS51p%2BVnfUtLjMZtUTW1siyuyd2nlx294tL0mnmFsOk%3D';

Известные проблемы

Запросы из Azure SQL Database и Azure SQL Managed Instance с использованием токенов SAS могут быть заблокированы с следующей ошибкой:

Msg 4861, Level 16, State 1, Line 27
Cannot bulk load because the file "FileName.extension" could not be opened. Operating system error code 5(Access is denied.).

В настоящее время только подмножество служб Azure находится в списке доверенных служб. Полный список доверенных служб и обновлений параметров брандмауэра службы хранилища Azure см. в разделе "Надежный доступ" для ресурсов, зарегистрированных в подписке.

Примеры

Наряду с примерами, приведенными в этой статье, вы также можете просмотреть образцы данных для импорта в базу данных Azure SQL на GitHub.

Доступ к данным в CSV-файле, ссылающемся на расположение в хранилище BLOB-объектов Azure

В следующем примере используется внешний источник данных, указывающий на учетную запись Azure MyAzureInvoices.

CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://newinvoices.blob.core.windows.net',
    CREDENTIAL = UploadInvoices
);

Затем инструкция OPENROWSET добавляет имя контейнера (week3) к описанию файла. Имя файла — inv-2017-01-19.csv.

SELECT * FROM OPENROWSET(
   BULK 'week3/inv-2017-01-19.csv',
   DATA_SOURCE = 'MyAzureInvoices',
   FORMAT = 'CSV',
   FORMATFILE = 'invoices.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
) AS DataFile;

Используя BULK INSERT, используйте контейнер и описание файла:

BULK INSERT Colors2
FROM 'week3/inv-2017-01-19.csv'
WITH (DATA_SOURCE = 'MyAzureInvoices', FORMAT = 'CSV');

Доступ к данным в CSV-файле, содержащем ссылку на контейнер в расположении Хранилища BLOB-объектов Azure

В следующем примере используется внешний источник данных, указывающий на контейнер week3 в учетной записи хранения Azure.

CREATE EXTERNAL DATA SOURCE MyAzureInvoicesContainer
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
    CREDENTIAL = UploadInvoices
);

OPENROWSET Затем инструкция не содержит имя контейнера в описании файла:

SELECT * FROM OPENROWSET(
   BULK 'inv-2017-01-19.csv',
   DATA_SOURCE = 'MyAzureInvoicesContainer',
   FORMAT = 'CSV',
   FORMATFILE = 'invoices.fmt',
   FORMATFILE_DATA_SOURCE = 'MyAzureInvoices'
) AS DataFile;

При использовании BULK INSERTне используйте имя контейнера в описании файла:

BULK INSERT Colors2
FROM 'inv-2017-01-19.csv'
WITH (DATA_SOURCE = 'MyAzureInvoicesContainer', FORMAT = 'CSV');