Application de l’unicité dans les valeurs d’une colonne

Dernière modification : mardi 16 mars 2010

S’applique à : SharePoint Foundation 2010

Dans cet article
Définition du terme « unique »
Prise en charge des contraintes de colonne unique
Indexation d’une colonne avec des contraintes d’unicité
Définition des contraintes d’unicité par programmation
Migration de contenu et contraintes de colonne unique
Opération Copier vers et Déplacer vers avec des contraintes de colonne

Vous pouvez appliquer l’unicité sur des valeurs d’une colonne de liste ou de bibliothèque, créant ainsi réellement une clé primaire. Alors qu’auparavant la colonne d’identité (ID) était le seul moyen de fournir une unicité sur une liste ou une bibliothèque, Microsoft SharePoint Foundation 2010 introduit une nouvelle fonctionnalité appelée contraintes de colonne unique, qui vous permet d’appliquer l’unicité.

Définition du terme « unique »

Pour être clair, la déclaration de l’unicité n’est pas un problème trivial, et il est donc important de définir avec précision ce que signifie « unique ». SharePoint Foundation évalue les valeurs d’une colonne et détermine l’unicité sur la base de son évaluation des valeurs présentes dans la colonne. Pour l’évaluation, SharePoint Foundation utilise l’ordre de tri du site (SPWeb) pour faire les comparaisons d’unicité. Notez que la comparaison n’est pas sensible à la casse : les valeurs « bonjour le monde » et « Bonjour le Monde » sont donc évaluées comme étant équivalentes.

Prise en charge des contraintes de colonne unique

Le facteur clé pour déterminer si une colonne prend en charge les contraintes d’unicité est de savoir si cette colonne peut être indexée. De plus, lorsque l’unicité est appliquée sur une colonne de recherche, l’élément de liste de la liste cible ne peut avoir qu’un seul élément de liste le recherchant depuis la liste enfant (la liste où se trouve la colonne de recherche). En d’autres termes, l’unicité n’est pas appliquée sur la colonne projetée de la liste cible, mais bien sur la colonne ID. Les types de colonnes qui prennent en charge la possibilité d’être indexée et celles qui ne la prennent pas en charge sont répertoriées ci-dessous.

Types de colonnes pris en charge

Voici une liste des types de colonnes qui peuvent être indexés et pour lesquels les contraintes de colonne unique sont prises en charge :

  • Une seule ligne de texte

  • Champ Choix (mais pas Choix multiples)

  • Nombre

  • Devise

  • Date/ Heure

  • Recherche (mais pas Valeurs multiples)

  • Personne ou Groupe (mais pas Valeurs multiples)

  • Titre (mais pas dans une bibliothèque de documents)

Types de colonnes non pris en charge

Voici une liste des types de colonnes qui ne peuvent pas être indexés et pour lesquels les contraintes de colonne unique ne sont pas prises en charge :

  • Plusieurs lignes de texte

  • Lien hypertexte/Image

  • Types de champ personnalisés

  • Champ calculé

  • Booléen (oui/non)

  • Modifié par

  • Heure de la dernière modification

  • Version de l’interface utilisateur

  • Heure de création

  • Extrait pour

  • ID du type de contenu

Indexation d’une colonne avec des contraintes d’unicité

Comme nous l’avons vu, une colonne qui applique une contrainte d’unicité doit être indexée. Lorsque l’utilisateur sélectionne Appliquer des valeurs uniques et clique sur OK, une boîte de dialogue d’avertissement est affichée si la colonne n’est pas déjà indexée ; l’utilisateur peut choisir d’indexer automatiquement la colonne. Lorsqu’une colonne a été définie pour appliquer l’unicité, l’indexation ne peut pas être désactivée pour cette colonne. Cependant, vous pouvez désactiver l’indexation pour cette colonne si vous désactivez d’abord l’application des contraintes d’unicité.

Définition des contraintes d’unicité par programmation

Utilisez la propriété EnforceUniqueValues sur l’objet SPField pour définir une colonne où requérir des valeurs uniques. La propriété reçoit et définit une valeur booléenne pour spécifier si les valeurs en doublon sont autorisées ; l’option par défaut est d’autoriser les valeurs en doublon. Vous devez donc définir explicitement la propriété d’un champ de colonne à true.

L’exemple de code ci-dessous montre la modification d’un champ pour requérir des valeurs uniques. Notez que le champ doit être explicitement mis à jour après avoir modifié la valeur de la propriété.

SPSite site = new SPSite("https://localhost");
SPWeb web = site.OpenWeb();

SPList custList = web.Lists["Customers"];
SPField custPhone = custList.Fields["Phone Number"];

custPhone.Indexed = true;
custPhone.EnforceUniqueValues = true;

/// You must call the Update() method 
/// when you change the EnforceUniqueValues property
custPhone.Update();

Cas d’erreur - Exceptions

Il existe deux cas d’erreur associés à l’utilisation de la propriété EnforceUniqueValues pour appliquer l’unicité :

  • EnforceUniqueValues = true est défini sur un champ non indexé.
    Génère un objet d’exception (SPException) avec un message indiquant que le champ doit d’abord être indexé pour appliquer des valeurs uniques.

  • EnforceUniqueValues = true est défini sur une liste qui a des valeurs existantes en double.
    Génère un objet d’exception (SPException) avec un message indiquant « Ce champ affiche des valeurs en double. Supprimez toutes les valeurs en double et recommencez l’opération. »

Migration de contenu et contraintes de colonne unique

La migration de contenu à l’aide des API de l’espace de noms Microsoft.SharePoint.Deployment prend en charge des migrations partielles (sélectives) et des migrations de collections de sites complètes à l’aide de fonctions d’exportation/importation. Lors de l’utilisation des API de déploiement dans des scénarios de migration complète, vous devez vous assurer que si la propriété d’unicité est définie sur le champ de liste de la source de l’exportation (c’est-à-dire si la propriété EnforceUniqueValues est définie à true), le paramètre doit être conservé sur la cible de l’importation.

Cependant, lorsque vous effectuez une migration partielle (ou « sélective ») dans laquelle vous fusionnez des fichiers de la collection de sites source avec des fichiers sur la cible, l’opération prendra automatiquement en compte les états d’unicité, selon ce qui est indiqué ci-après.

Colonnes uniques sur la source, non uniques sur la cible

  1. Les éléments sont importés vers la destination (la cible).

  2. Ensuite, la propriété EnforceUniqueValues est définie à true sur la cible.

Notez que cette opération peut échouer si des éléments en double existent sur la cible, en violation de la contrainte d’unicité. Si cela se produit, la valeur de la propriété d’unicité ne sera pas définie et la tentative retournera une erreur non irrécupérable.

Colonnes uniques sur la source, uniques sur la cible

Effectuez l’exportation/importation sur les éléments de liste normalement.

Cette opération échouera si un élément du package d’importation viole la contrainte d’unicité. Si cela se produit, l’élément ne sera pas importé et la tentative retournera une erreur non irrécupérable.

Colonnes non uniques sur la source, uniques sur la cible

  1. Désactivez d’abord l’unicité sur le champ de la liste cible en définissant la propriété EnforceUniqueValues à false sur la cible.

  2. Importez les éléments de liste vers la cible normalement.

Notes

Les trois scénarios indiqués ci-dessus sont également valides dans les cas où la propriété RetainObjectIdentity est utilisée à l’importation. Dans ce cas, au lieu d’importer un double de l’élément sur la cible, les éléments qui existent déjà sur la cible sont mis à jour pour correspondre à l’élément qui est exporté depuis la source.

Opération Copier vers et Déplacer vers avec des contraintes de colonne

Des considérations spéciales sont à prendre en compte lorsque vous copiez ou que vous déplacez des éléments vers une bibliothèque de documents qui applique des contraintes de colonne unique, et que vous utilisez les méthodes CopyTo(String) et MoveTo(String) sur la classe SPFile pour effectuer ces opérations. Vous devez prendre garde à cela dans les scénarios où vous déplacez ou vous copiez un fichier dans une telle bibliothèque.

Dans la mesure où il y a un risque potentiel de perdre des données dans des scénarios MoveTo(), et parce que ce risque est considérablement réduit dans des scénarios CopyTo() (car le fichier de la source n’est pas supprimé), la règle générale à suivre est de bloquer les contraintes de colonne unique dans les opérations MoveTo(), mais de les autoriser dans les opérations CopyTo(). La matrice suivante détaille les spécificités :

Copy To operation

Move To operation

Dans la même bibliothèque de documents

Vérifie les violations d’unicité au niveau des documents. Ne vérifie pas entre les dossiers des bibliothèques.

Déplace sans vérification.

Entre des bibliothèques de documents

Convertit les valeurs en null.

Bloque le déplacement si la liste de destination a des valeurs sur lesquelles l’unicité est appliquée.

En dehors de la bibliothèque de documents

Pas d’effet.

Pas d’effet.

Dans la bibliothèque de documents

Convertit les valeurs en null.

Convertit les valeurs en null.

Voir aussi

Référence

EnforceUniqueValues

RetainObjectIdentity

SPFile.CopyTo(String)

SPFile.MoveTo(String)