Exigencia de unicidad en valores de columnas
Última modificación: martes, 16 de marzo de 2010
Hace referencia a: SharePoint Foundation 2010
En este artículo
Definición de "único"
Compatibilidad con restricciones de columnas únicas
Indización de una columna con restricciones de unicidad
Establecimiento de restricciones de unicidad mediante programación
Migración de contenido y restricciones de columnas únicas
Operaciones Copiar a y Mover a con restricciones de columnas
Puede exigirse unicidad en los valores de una columna de una lista o biblioteca creando de forma eficaz una clave principal. Si bien antes la columna de identidad (ID) era la única forma de proporcionar unicidad en una lista o biblioteca, Microsoft SharePoint Foundation 2010 incorpora una nueva característica llamada restricciones de columnas únicas, que permite exigir unicidad.
Definición de "único"
Como es evidente, declarar unicidad no es una cuestión trivial, por lo que es importante definir con precisión qué se entiende por "único". SharePoint Foundation evalúa los valores de una columna y determina la unicidad basándose en su evaluación de los valores presentes en la columna. Para la evaluación, SharePoint Foundation usa el criterio de ordenación del sitio (SPWeb) para realizar comparaciones de unicidad. Tenga en cuenta que la comparación no distingue entre mayúsculas y minúsculas, por lo que los valores "hola mundo" y "Hola Mundo" son equivalentes en la evaluación.
Compatibilidad con restricciones de columnas únicas
El factor clave para determinar si una columna admite restricciones de unicidad depende de si la columna se puede indizar. Además, cuando la unicidad se exige a una columna de búsqueda, el elemento de lista de la lista de objetivo puede tener un solo elemento que se rija por él en la lista secundaria (la lista donde se encuentra la columna de búsqueda). En otras palabras, la unicidad no se exige a la columna proyectada de la lista de objetivo, sino a la columna de identificador. A continuación, se enumeran los tipos de columna que admiten indización y los que no la admiten.
Tipos de columna admitidos
A continuación se enumeran los tipos de columna que se pueden indizar y que admiten restricciones de columnas únicas:
Una línea de texto
Campo de opción (pero no de varias opciones)
Número
Moneda
Fecha y hora
Búsqueda (pero no de varios valores)
Persona o grupo (pero no de varios valores)
Título (pero no en una biblioteca de documentos)
Tipos de columna no admitidos
A continuación se enumeran los tipos de columna que no se pueden indizar y que no admiten restricciones de columnas únicas:
Varias líneas de texto
Hipervínculo/Imagen
Tipos de campo personalizados
Campo calculado
Booleano (sí/no)
Modificado por
Hora de modificación
Versión de UI
Hora de creación
Desprotegido para
Id. de tipo de contenido
Indización de una columna con restricciones de unicidad
Como ya señalamos, una columna que exige una restricción de unicidad debe indizarse. Cuando el usuario selecciona Aplicar valores únicos y hace clic en Aceptar, se muestra un diálogo de advertencia si la columna aún no está indizada y el usuario tiene la opción de indizar automáticamente la columna. Después de establecer una columna para exigir unicidad, la indización no se puede desactivar para dicha columna. No obstante, es posible desactivar la indización si primero se deshabilita la exigencia de restricciones de unicidad.
Establecimiento de restricciones de unicidad mediante programación
Use la propiedad EnforceUniqueValues del objeto SPField para establecer que una columna requiera valores únicos. La propiedad obtiene y establece un valor booleano para especificar si se permiten valores duplicados; la opción predeterminada es permitir valores duplicados, por lo que debe establecer explícitamente una propiedad de campo de columna en true.
El ejemplo de código siguiente ilustra la modificación de un campo para que requiera valores únicos. Observe que el campo debe actualizarse explícitamente después de cambiar el valor de la propiedad.
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();
Casos de error - Excepciones
Hay dos casos de error asociados con el uso de la propiedad EnforceUniqueValues para exigir unicidad:
EnforceUniqueValues = true está establecido en un campo no indizado.
Inicia un objeto de excepción (SPException) con el mensaje: "Este campo debe estar indizado para poder aplicar valores únicos.".EnforceUniqueValues = true se estableció en una lista que tiene valores duplicados.
Inicia un objeto de excepción (SPException) con el mensaje: "Este campo contiene valores duplicados. Quite todos los valores duplicados e intente realizar la operación de nuevo.".
Migración de contenido y restricciones de columnas únicas
La migración de contenido mediante el uso de API en el espacio de nombres Microsoft.SharePoint.Deployment admite migraciones de colecciones de sitios parciales (selectivas) y completas usando funciones de exportación e importación. Cuando se usan las API de implementación en escenarios de migración completa, debe asegurarse de que si la propiedad de unicidad está establecida en el campo de lista del origen de exportación (es decir, si la propiedad EnforceUniqueValues está establecida en true), la configuración debe mantenerse en el destino de importación.
No obstante, cuando se realiza una migración parcial (o "selectiva") en la que se combinan archivos de la colección de sitios de origen con archivos del destino, la operación dará cuenta automáticamente de los estados de unicidad, según se describe aquí.
Columnas únicas en el origen, no únicas en el destino
Los elementos se importan al destino.
A continuación, la propiedad EnforceUniqueValues se establece en true en el destino.
Tenga en cuenta que esta operación puede producir un error si existen elementos duplicados en la lista de objetivo que violen la restricción de unicidad. En este caso, no se establecerá el valor de propiedad de unicidad y el intento devolverá un error no grave.
Columnas únicas en el origen, únicas en el destino
Realice la exportación o importación de los elementos de la lista normalmente.
Esta operación producirá un error si un elemento del paquete de importación viola la restricción de unicidad. En este caso, el elemento no se importará y el intento devolverá un error no grave.
Columnas no únicas en el origen, únicas en el destino
Primero, deshabilite la unicidad del campo de la lista de objetivo estableciendo la propiedad EnforceUniqueValues en false en el destino.
Importe los elementos de lista al destino normalmente.
Nota
Los tres escenarios anteriores también son válidos en casos en que la propiedad RetainObjectIdentity se usa en la importación. En este caso, en vez de importar un duplicado del elemento en el destino, los elementos que ya existen en el destino se actualizan para que coincidan con el elemento que se exportó del origen.
Operaciones Copiar a y Mover a con restricciones de columnas
Deben tenerse en cuenta consideraciones especiales cuando se copian o mueven elementos a una biblioteca de documentos que exige restricciones de columnas únicas y se deben usar los métodos CopyTo(String) y MoveTo(String) de la clase SPFile para realizar estas operaciones. Esto debe tenerse en cuenta en escenarios en los que se mueve o copia un archivo a una biblioteca de dichas características.
Debido a que es posible perder datos en escenarios de MoveTo(), y debido a que esta posibilidad es mucho menor en escenarios de CopyTo() (ya que el archivo de origen no se quita de su lugar), la regla general que se debe seguir es bloquear las restricciones de columnas únicas en operaciones de MoveTo() y permitirlas en las operaciones de CopyTo(). La matriz siguiente contiene información específica:
Copy To operation |
Move To operation |
|
Dentro de la misma biblioteca de documentos |
Comprueba que no hay violaciones de unicidad a nivel del documento. No comprueba todas las carpetas de la biblioteca. |
Mueve el elemento sin comprobarlo. |
Entre bibliotecas de documentos |
Convierte los valores a null. |
Bloquea la migración si la lista de destino exige valores únicos. |
Desde la biblioteca de documentos |
Sin efecto. |
Sin efecto. |
Hacia la biblioteca de documentos |
Convierte los valores a null. |
Convierte los valores a null. |