Exemples d’accès en bloc à des données dans Stockage Blob Azure

S’applique à : SQL Server 2017 (14.x) et versions ultérieuresAzure SQL Database

Les instructions BULK INSERT et OPENROWSET peuvent accéder directement à un fichier dans Stockage Blob Azure. Les exemples suivants utilisent des données d’un fichier de valeurs séparées par des virgules (CSV) nommé inv-2017-01-19.csv, stocké dans un conteneur nommé Week3 dans un compte de stockage nommé newinvoices.

Tous les chemins du conteneur et des fichiers sur les objets blob sont sensibles à la casse. Si la casse n’est pas correcte, cela peut retourner une erreur comme dans l’exemple suivant :

Chargement en masse impossible. Le fichier « fichier.csv » n’existe pas ou vous ne disposez pas des droits d’accès au fichier.

Créer les informations d’identification

La source de données externe doit être créée avec des informations d’identification incluses dans l’étendue de la base de données utilisant l’identité SHARED ACCESS SIGNATURE. Pour créer une signature d’accès partagé (SAP) pour votre compte de stockage, examinez la propriété Signature d’accès partagé dans la page de propriétés du compte de stockage, dans le portail Azure. Pour plus d’informations sur les signatures d’accès partagé, consultez Accorder un accès limité aux ressources du Stockage Azure à l’aide des signatures d’accès partagé (SAP). Pour plus d’informations sur les informations d’identification, consultez CREATE DATABASE SCOPED CREDENTIAL.

Créez des informations d’identification incluses dans l’étendue de la base de données avec IDENTITY qui doit avoir la valeur SHARED ACCESS SIGNATURE. Utilisez le jeton SAP généré pour le compte de stockage d’objets blob. Vérifiez que votre jeton SAP ne commence pas par ?, que vous disposez au moins d’une autorisation de lecture sur l’objet qui doit être chargé et que la période d’expiration est valide (toutes les dates sont exprimées en heure UTC).

Par exemple :

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

Problèmes connus

Les requêtes provenant de Azure SQL Database et Azure SQL Managed Instance à l’aide de jetons SAP peuvent être bloquées avec l’erreur suivante :

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

Seul un sous-ensemble de services Azure fait actuellement partie de la liste des services approuvés. Pour obtenir la liste complète des services et des mises à jour approuvés sur les paramètres de pare-feu de stockage Azure, consultez Accès approuvé pour les ressources inscrites dans votre abonnement.

Exemples

En plus des exemples de cet article, vous pouvez également consulter les Exemples de données d’importation Azure SQL Database sur GitHub.

Accès aux données dans un fichier CSV faisant référence à un emplacement de stockage Blob Azure

L’exemple suivant utilise une source de données externe qui pointe vers un compte de stockage Azure, nommé MyAzureInvoices.

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

L’instruction OPENROWSET ajoute ensuite le nom du conteneur (week3) à la description du fichier. Le fichier est nommé 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;

À l’aide de BULK INSERT, utilisez le conteneur et la description du fichier :

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

Accès aux données dans un fichier CSV faisant référence à un conteneur à un emplacement de stockage Blob Azure

L’exemple suivant utilise une source de données externe qui pointe vers un conteneur (nommé week3) dans un compte de stockage Azure.

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

L’instruction OPENROWSET n’ajoute pas ensuite le nom du conteneur à la description du fichier :

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

À l’aide de BULK INSERT, n’utilisez pas le nom du conteneur dans la description du fichier :

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