Contôle de la vérification des contraintes par les opérations d'importation en bloc

Lors d'une importation en bloc de données, vous pouvez décider d'imposer l'application des contraintes CHECK par l'opération d'importation en bloc. Une contrainte est une règle métier qui est placée dans une colonne dans le but d'en définir les valeurs valides ; par exemple, une contrainte de colonne contenant des numéros de postes pourra-t-elle exiger le format ####. La définition de contraintes et leur vérification consistent en un mécanisme classique qui vise à assurer l'intégrité des données. Microsoft recommande d'utiliser la vérification des contraintes lors d'une importation en bloc incrémentielle.

Dans certains cas, vous souhaiterez peut-être ignorer les contraintes. Un tel scénario peut s'envisager si vos données d'entrée contiennent des lignes qui violent des contraintes. En ignorant les contraintes, vous pouvez charger les données puis utiliser des instructions Transact-SQL pour nettoyer ces données.

[!REMARQUE]

Si vous ignorez les contraintes lors d'une opération d'importation en bloc, les données qui violent les contraintes existantes peuvent être insérées dans la table. Ainsi, la contrainte placée dans la table est marquée is_not_trusted dans l'affichage catalogue sys.check_constraints (pour plus d'informations, consultez sys.check_constraints (Transact-SQL)). À un point donné, vous devez vérifier les contraintes sur toute la table.

Si la table n'était pas vide avant l'opération d'importation en bloc, le coût de la revalidation de la contrainte peut dépasser celui de l'application des contraintes CHECK aux données incrémentielles. Une fois les données problématiques importées, vous devez utiliser Transact-SQL pour nettoyer les données importées.

Important

Lorsque les contraintes sont désactivées, un verrou de modification de schéma peut être appliqué pour mettre à jour les métadonnées. Cela peut interférer avec d'autres commandes (de contruction d'index en ligne, par ex.) ou transactions. Par exemple, une transaction d'isolement de capture instantanée accédant à la table cible peut échouer à cause de modifications de DDL simultanées.

Pour plus d'informations sur les contraintes, consultez Contraintes.

Lors d'une opération d'importation en bloc, le comportement du contrôle des contraintes varie en fonction de la commande utilisée pour l'opération. Par défaut, la commande bcp et l'instruction BULK INSERT ignorent les contraintes. À l'inverse, l'instruction INSERT ... SELECT * FROM OPENROWSET(BULK...) contrôle les contraintes par défaut.

Le tableau suivant résume le comportement par défaut de la vérification des contraintes en fonction des commandes d'importation en bloc.

Commande

Comportement par défaut

bcp

Ignore les contraintes

BULK INSERT

Ignore les contraintes

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

Vérifie les contraintes

Chaque commande d'importation en bloc fournit un qualificateur qui permet de modifier la façon dont les contraintes sont traitées, comme expliqué dans les sections suivantes.

Vérification des contraintes avec bcp ou BULK INSERT

Par défaut, les contraintes sont ignorées lors d'une opération d'importation en bloc exécutée via la commande bcp ou l'instruction BULK INSERT.

La commande bcp et l'instruction BULK INSERT permettent de préciser que les contraintes doivent être appliquées lors d'une opération d'importation en bloc. Si l'application des contraintes a pour effet de ralentir l'opération d'importation en bloc, elle apporte néanmoins la garantie que l'ensemble des données insérées ne violent pas les contraintes existantes. Le tableau suivant récapitule les qualificateurs que vous pouvez utiliser pour spécifier l'application des contraintes lors d'une opération d'importation en bloc.

Commande

Qualificateur

Type de qualificateur

bcp

-h"CHECK_CONSTRAINTS"

Indicateur

BULK INSERT

CHECK_CONSTRAINTS

Argument

Pour plus d'informations, consultez Utilitaire bcp et BULK INSERT (Transact-SQL).

Désactivation du contrôle des contraintes dans INSERT ... SELECT * FROM OPENROWSET(BULK...)

Par défaut, INSERT vérifie les contraintes CHECK, toutefois l'instruction INSERT ... SELECT * FROM OPENROWSET(BULK...) vous permet de passer outre la vérification des contraintes CHECK. Pour plus d'informations sur ces contraintes, consultez Contraintes CHECK.

[!REMARQUE]

Seules les contraintes CHECK peuvent être désactivées. Vous ne pouvez pas désactiver les contraintes UNIQUE, PRIMARY KEY, FOREIGN KEY ou NOT NULL.

Le tableau suivant présente l'indicateur de table utilisé pour ignorer les contraintes CHECK.

Commande

Qualificateur

Type de qualificateur

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

WITH (IGNORE_CONSTRAINTS)

Indicateur de table

L'exemple suivant illustre la façon dont cet indicateur est utilisé. Pour plus d'informations sur l'indicateur IGNORE_CONSTRAINTS, consultez Indicateurs de table (Transact-SQL).

Vérification des données importées

Si vous ignorez des contraintes dans une importation en bloc, vous pouvez ultérieurement identifier les lignes de table importées qui violent des contraintes en vérifiant les données importées manuellement. Pour vérifier les données manuellement, vous pouvez utiliser des requêtes Transact-SQL ou des procédures stockées qui testent les conditions de contrainte.

[!REMARQUE]

Pour savoir si une table est approuvée, consultez la colonne is_not_trusted dans l'affichage catalogue sys.check_constraints. Pour plus d'informations, consultez sys.check_constraints (Transact-SQL).