Importation de données en bloc à l'aide de BULK INSERT ou OPENROWSET(BULK...)

Cette rubrique fournit une vue d'ensemble de l'utilisation de l'instruction BULK INSERT Transact-SQL et de l'instruction INSERT... SELECT * FROM OPENROWSET (BULK...) pour importer en bloc les données d'un fichier de données dans une table Microsoft SQL Server. Cette rubrique décrit aussi des règles de sécurité relatives à l'utilisation de BULK INSERT et OPENROWSET(BULK…), et l'utilisation de ces méthodes pour l'importation en bloc à partir d'une source de données distante.

Notes

Lorsque vous utilisez BULK INSERT ou OPENROWSET(BULK…), il est important de comprendre la manière dont SQL Server 2005 et les versions ultérieures gèrent l'emprunt d'identité. Pour plus d'informations, consultez « Considérations sur la sécurité» plus loin dans cette rubrique.

Instruction BULK INSERT

BULK INSERT charge les données d'un fichier de données dans une table. Cette fonctionnalité est similaire à celle fournie par l'option in de la commande bcp, mais le fichier de données est lu par le processus SQL Server. Pour obtenir une description de la syntaxe BULK INSERT, consultez BULK INSERT (Transact-SQL).

Exemples

Fonction OPENROWSET(BULK…)

Le fournisseur d'ensembles de lignes en bloc OPENROWSET est accessible en appelant la fonction OPENROWSET et en spécifiant l'option BULK. La fonction OPENROWSET(BULK…) vous permet d'accéder aux données distantes en vous connectant à une source de données distante (un fichier de données) par l'intermédiaire d'un fournisseur OLE DB.

Pour importer en bloc des données, appelez OPENROWSET(BULK…) à partir d'une clause SELECT…FROM dans une instruction INSERT. La syntaxe de base pour l'importation en bloc de données est la suivante :

INSERT ... SELECT * FROM OPENROWSET(BULK...)

En cas d'utilisation dans une instruction INSERT, OPENROWSET (BULK...) prend en charge des indicateurs de table. En plus des indicateurs de table normaux, tels que TABLOCK, la clause BULK peut accepter les indicateurs de table spécialisés suivants : IGNORE_CONSTRAINTS (ignore uniquement les contraintes CHECK), IGNORE_TRIGGERS, KEEPDEFAULTS et KEEPIDENTITY. Pour plus d'informations, consultez Indicateurs de table (Transact-SQL).

Pour plus d'informations sur les autres utilisations de l'option BULK, consultez OPENROWSET (Transact-SQL).

Exemples

Considérations sur la sécurité

Si un utilisateur a recours à une connexion SQL Server, le profil de sécurité du compte du processus SQL Server est alors utilisé. Par opposition, si un utilisateur SQL Server s'est connecté via l'authentification Windows, il peut lire uniquement les fichiers accessibles par le compte d'utilisateur, indépendamment du profil de sécurité du processus SQL Server.

Prenons l'exemple d'un utilisateur qui s'est connecté à une instance de SQL Server à l'aide de l'authentification Windows. Pour que cet utilisateur puisse utiliser BULK INSERT ou OPENROWSET en vue d'importer les données d'un fichier dans une table SQL Server, le compte d'utilisateur nécessite des droits d'accès en lecture au fichier de données. En bénéficiant de droits accès au fichier de données, l'utilisateur peut importer les données du fichier dans une table même si le processus SQL Server n'a pas l'autorisation d'accéder au fichier. L'utilisateur n'est pas obligé d'accorder au processus SQL Server une autorisation d'accès au fichier.

SQL Server et Microsoft Windows peuvent être configurés afin de permettre à une instance de SQL Server de se connecter à une autre instance de SQL Server en transmettant les informations d'un utilisateur Windows authentifié. Ce procédé est appelé emprunt d'identité ou délégation. Il importe de comprendre comment SQL Server 2005 et les versions ultérieures gèrent les aspects de sécurité en matière d'emprunt d'identité lorsque vous utilisez l'instruction BULK INSERT ou OPENROWSET. L'emprunt d'identité permet au fichier de données de résider sur un ordinateur différent du processus SQL Server ou de l'utilisateur. Par exemple, si un utilisateur sur Ordinateur_A a accès à un fichier de données sur Ordinateur_B, et que la délégation des informations d'identification a été correctement définie, l'utilisateur peut se connecter à une instance de SQL Server s'exécutant sur Ordinateur_C, accéder au fichier de données sur Ordinateur_B, et importer les données en bloc de ce fichier dans une table résidant sur Ordinateur_C. Pour plus d'informations, consultez Présentation de l'emprunt d'identité.

Notes

La façon dont SQL Server 2005 et les versions ultérieures contrôlent l'accès aux fichiers résout un problème de sécurité qui existait dans Microsoft SQL Server 2000 et les versions précédentes. Auparavant, une fois l'utilisateur authentifié, l'accès aux fichiers externes reposait sur le profil de sécurité du processus SQL Server. Lorsque le processus SQL Server disposait d'un droit d'accès en lecture à un fichier, il suffisait à un utilisateur n'ayant pas accès au fichier d'être membre du rôle de serveur fixe bulkadmin pour pouvoir importer le fichier à l'aide de la commande BULK INSERT et accéder au contenu du fichier.

Importation en bloc à partir d'un fichier de données distant

Pour utiliser BULK INSERT ou INSERT... SELECT * FROM OPENROWSET (BULK...) dans le but d'importer en bloc des données depuis un autre ordinateur, le fichier de données doit être partagé entre les deux ordinateurs. Pour spécifier un fichier de données partagé, utilisez son nom UNC (Universal Naming Convention), dont le format général est **\\NomServeur\NomPartage\Chemin\**NomFichier. En outre, le compte utilisé pour accéder au fichier de données doit avoir reçu les autorisations requises pour lire le fichier sur le disque distant.

Par exemple, l'instruction BULK INSERT ci-dessous importe en bloc des données dans la table SalesOrderDetail de la base de données AdventureWorks2008R2 à partir d'un fichier de données nommé newdata.txt. Ce fichier de données réside dans un dossier partagé nommé \dailyorders, dans un répertoire partagé du réseau nommé salesforce, sur un système nommé computer2.

BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';
GO

Notes

Cette restriction ne s'applique pas à l'utilitaire bcp car le fichier est lu par le client, indépendamment de SQL Server.