Примеры массового доступа к данным в Хранилище 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');