Udostępnij za pośrednictwem


Przykłady zbiorczego dostępu do danych w usłudze Azure Blob Storage

Dotyczy: SQL Server 2017 (14.x) i nowszych Azure SQL DatabaseAzure SQL Managed Instance

Instrukcje BULK INSERT i OPENROWSET mogą uzyskiwać bezpośredni dostęp do pliku w usłudze Azure Blob Storage. W poniższych przykładach użyto danych z pliku CSV (wartości rozdzielone przecinkami) (o nazwie inv-2017-01-19.csv), przechowywanego w kontenerze (o nazwie Week3), przechowywanego na koncie magazynu (o nazwie newinvoices).

Wszystkie ścieżki do kontenera i do plików w usłudze Blob Storage są uwzględniane wielkości liter. Jeśli nie jest to poprawne, może wystąpić błąd podobny do następującego przykładu.

Nie można załadować zbiorczo. Plik "file.csv" nie istnieje lub nie masz praw dostępu do plików.

Utwórz poświadczenie

Zewnętrzne źródło danych musi zostać utworzone przy użyciu poświadczenia ograniczonego zakresem bazy danych, które wykorzystuje tożsamość SHARED ACCESS SIGNATURE. Aby utworzyć sygnaturę dostępu współdzielonego dla konta magazynowego, zobacz właściwość Sygnatura dostępu współdzielonego na stronie właściwości konta magazynowego w portalu Azure. Aby uzyskać więcej informacji na temat sygnatur dostępu współdzielonego, zobacz Udzielanie ograniczonego dostępu do zasobów usługi Azure Storage przy użyciu sygnatur dostępu współdzielonego (SAS). Aby uzyskać więcej informacji na temat poświadczeń, zobacz CREATE DATABASE SCOPED CREDENTIAL.

Utwórz poświadczenie o zakresie bazy danych przy użyciu IDENTITY, który musi być SHARED ACCESS SIGNATURE. Użyj tokenu SAS wygenerowanego dla konta usługi Blob Storage. Sprawdź, czy twój token SAS nie ma poprzedzającego znaku ?, czy masz co najmniej uprawnienia do odczytu dla obiektu, który należy załadować, i czy okres wygaśnięcia jest prawidłowy (wszystkie daty są w czasie UTC).

Na przykład:

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

Znane problemy

Żądania z usług Azure SQL Database i Azure SQL Managed Instance przy użyciu tokenów SAS mogą być blokowane z powodu następującego błędu:

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.).

Obecnie na liście zaufanych usług znajduje się tylko podzbiór usług platformy Azure. Aby uzyskać pełną listę zaufanych usług i aktualizacji w ustawieniach zapory usługi Azure Storage, zobacz Zaufany dostęp do zasobów zarejestrowanych w ramach subskrypcji.

Przykłady

Oprócz przykładów w tym artykule możesz również przejrzeć przykłady importowania danych w usłudze Azure SQL Database w usłudze GitHub.

Uzyskiwanie dostępu do danych w pliku CSV odwołującym się do lokalizacji usługi Azure Blob Storage

W poniższym przykładzie użyto zewnętrznego źródła danych wskazującego konto usługi Azure Storage o nazwie MyAzureInvoices.

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

Następnie instrukcja OPENROWSET dodaje nazwę kontenera (week3) do opisu pliku. Plik ma nazwę 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;

Korzystając z BULK INSERT, użyj kontenera i opisu pliku:

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

Uzyskiwanie dostępu do danych w pliku CSV odwołującym się do kontenera w lokalizacji usługi Azure Blob Storage

W poniższym przykładzie użyto zewnętrznego źródła danych wskazującego kontener (o nazwie week3) na koncie usługi Azure Storage.

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

Następnie instrukcja OPENROWSET nie zawiera nazwy kontenera w opisie pliku:

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

Przy użyciu BULK INSERTnie używaj nazwy kontenera w opisie pliku:

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