Azure Blob Storage의 데이터에 대한 대량 액세스 예제

적용 대상: SQL Server 2017 (14.x) 이상 Azure SQL Database

BULK INSERTOPENROWSET 문은 Azure Blob Storage의 파일에 직접 액세스할 수 있습니다. 다음 예제에서는 newinvoices라는 스토리지 계정 및 Week3이라는 컨테이너에 저장된 inv-2017-01-19.csv라는 CSV(쉼표로 구분된 값) 파일의 데이터를 사용합니다.

컨테이너 및 Blob Storage의 파일에 대한 모든 경로는 대소문자를 구분합니다. 올바르지 않으면 다음 예제와 같은 오류가 반환될 수 있습니다.

대량 로드할 수 없습니다. "file.csv" 파일이 없거나 파일 액세스 권한이 없습니다.

자격 증명 만들기

외부 데이터 원본은 SHARED ACCESS SIGNATURE ID를 사용하는 데이터베이스 범위 자격 증명으로 만들어야 합니다. 스토리지 계정에 대한 SAS(공유 액세스 서명)를 만들려면 Azure Portal에서 스토리지 계정 속성 페이지의 공유 액세스 서명 속성을 참조하세요. 공유 액세스 서명에 대한 자세한 내용은 SAS(공유 액세스 서명)를 사용하여 Azure Storage 리소스에 대한 제한된 액세스 권한 부여를 참조하세요. 자격 증명에 대한 자세한 내용은 CREATE DATABASE SCOPED CREDENTIAL을 참조하세요.

SHARED ACCESS SIGNATURE여야 하는 IDENTITY를 사용하여 데이터베이스 범위 자격 증명을 만듭니다. Blob Storage 계정에 대해 생성된 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 Database 및 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 Storage 방화벽 설정에 대한 신뢰할 수 있는 서비스 및 업데이트의 전체 목록은 구독에 등록된 리소스에 대한 신뢰할 수 있는 액세스를 참조하세요.

예제

이 문서의 예제와 함께 GitHub에서 Azure SQL Database 가져오기 데이터 샘플을 검토할 수도 있습니다.

Azure Blob Storage 위치를 참조하는 CSV 파일의 데이터에 액세스

다음 예제에서는 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');

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