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

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

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

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

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

Создание учетных данных

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

Создайте учетные данные в области базы данных, которые 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';

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

Запросы от База данных SQL Azure и Управляемый экземпляр SQL Azure с помощью маркеров 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 см. в разделе "Надежный доступ" для ресурсов, зарегистрированных в подписке.

Примеры

Наряду с примерами, приведенными в этой статье, вы также можете просмотреть примеры данных База данных SQL Azure импорта на 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');