Azure Blob Storage のデータに一括アクセスする例

適用対象: SQL Server 2017 (14.x) 以降 Azure SQL データベース Azure SQL Managed Instance

BULK INSERT ステートメントと OPENROWSET ステートメントでは、Azure Blob Storage 内のファイルに直接アクセスできます。 次の例では、inv-2017-01-19.csv という名前の CSV (コンマ区切り値) ファイルのデータを使用します。このファイルは newinvoices という名前のストレージ アカウントで Week3 という名前のコンテナーに格納されています。

コンテナーと Blob Storage 上のファイルへのパスはすべて、大文字と小文字が区別されます。 間違った場合、次の例のようなエラーを返すことがあります。

一括読み込みができません。 ファイル 「file.csv」 が存在しないか、ファイルへのアクセス権がありません。

資格情報を作成する

外部データ ソースは、SHARED ACCESS SIGNATURE ID を使用するデータベース スコープ資格情報で作成する必要があります。 ストレージ アカウントの Shared Access Signature (SAS) を作成するには、Azure portal のストレージ アカウント プロパティに関するページで Shared Access Signature プロパティを参照してください。 Shared Access Signature の詳細については、「Shared Access Signatures (SAS) を使用して Azure Storage リソースへの制限付きアクセスを許可する」を参照してください。 資格情報の詳細については、「CREATE DATABASE SCOPED CREDENTIAL」 (データベース スコープ資格情報を作成する) を参照してください。

IDENTITY (SHARED ACCESS SIGNATURE に設定します) を利用してデータベース スコープ資格情報を作成します。 BLOB ストレージ アカウントに対して生成された SAS トークンを使用します。 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';

既知の問題

SAS トークンを使用する Azure SQL データベース と Azure SQL Managed Instance からの要求は、次のエラーでブロックされる場合があります。

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 ストレージ ファイアウォール設定に関する信頼されたサービスと更新の完全な一覧については、「サブスクリプションに登録されているリソースへの信頼されたアクセス」を参照してください。

この記事の例と共に、GitHub 上の「Azure SQL Database import data samples (Azure SQL Database でデータをインポートするサンプル)」も確認できます。

Azure Blob Storage の場所を参照する CSV ファイルのデータにアクセスする

次の例では、MyAzureInvoices という名前の Azure ストレージ アカウントを指す外部データ ソースを使用します。

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');

Azure Blob Storage の場所にあるコンテナーを参照する CSV ファイルのデータにアクセスする

次の例では、Azure ストレージ アカウントにあるコンテナー (week3 という名前) を指す外部データ ソースを使用します。

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');