La Integridad de Datos

Niveles de la integridad de datos

La integridad de datos se define en los siguientes niveles:

Integridad de dominio

Se conoce como el dominio de un atributo al conjunto de valores aceptables para dicho atributo. La integridad de dominio establece qué condiciones deben cumplir los valores a insertar en una columna. La integridad de dominio se define mediante reglas de validación, valores predeterminados, conjunto de valores permitidos en la columna (llave foránea), tipo y formato de los datos.

Integridad de entidad

Una tabla almacena los datos de cada una de las ocurrencias de una entidad. La entidad (o tabla) requiere que todas sus filas sean únicas. Esto se garantiza definiendo para cada fila de la entidad un identificador único (llave primaria).

Integridad referencial

La integridad referencial garantiza que la relación entre la llave primaria (en la tabla referenciada) y la llave foránea (en la tabla de referencia) siempre se mantiene. Una fila en una tabla referenciada no puede anularse, ni cambiar su valor de la llave primaria, si una llave foránea se refiere a la fila.

Los modos de integridad

La integridad de datos se puede definir como parte de la declaración de una tabla, ó también mediante programación.

Integridad declarativa

La integridad declarativa se establece cuando definimos la integridad de datos como parte de la definición de la tabla. Consiste en la creación de restricciones (constraints), y se define mediante las instrucciones CREATE TABLE y ALTER TABLE.

Integridad procedural

La integridad procedural se establece cuando definimos la integridad de datos a través de la programación. Consiste en la creación de desencadenantes (triggers), procedimientos almacenados (stored procedures), y funciones (user defined functions).

Las restricciones (constraints)

Las restricciones son un método declarativo de definición de la integridad de datos ya que ellas se definen al momento de crear la tabla (con la sentencia CREATE TABLE), o al momento de modificar la definición de la tabla (con la sentencia ALTER TABLE). En otras palabras, una restricción forma parte de la definición de la tabla. Las restricciones son el método preferido para dar fuerza a la integridad de los datos.

Tipos de restricciones

Las restricciones son un método estándar ANSI para forzar la integridad de los datos. Garantizan que los datos ingresados en las columnas sean valores válidos y que se mantengan las relaciones entre las tablas. La tabla siguiente describe los diferentes tipos de restricciones.

Tipos de restricciones
Las restricciones se definen al momento de definir la tabla con las sentencias CREATE TABLE o ALTER TABLE.

CREATE TABLE nombre_tabla(
columna1 tipo_dato propiedades
CONSTRAINT nombre_restricción ... ,
columna2 tipo_dato propiedades
CONSTRAINT nombre_restricción ... , ... )
ALTER TABLE nombre_tabla
ADD CONSTRAINT nombre_restricción ...

La restricción DEFAULT (valor predeterminado)

Define cuál es el valor por defecto de una columna cuando al ejecutar INSERT no se especifica el valor de dicha columna. Ejemplo

USE biblioteca
ALTER TABLE prestamo
ADD CONSTRAINT df_fecha_sal
DEFAULT getdate( ) FOR pre_fec_sal

Establece que el valor predeterminado de la columna pre_fec_sal de la tabla prestamo es la fecha del sistema.

La restricción CHECK (regla de validación)

Define la regla que debe cumplir el valor a ingresar a una columna. Se verifica durante la ejecución de INSERT y UPDATE. Ejemplo

ALTER TABLE ejemplar
ADD CONSTRAINT chk_disponibilidad
CHECK ( eje_dis LIKE '[SN]' )

El contenido de la columna eje_dis de la tabla ejemplar debe ser 'S' o 'N'.

La restricción PRIMARY KEY (llave primaria)

Define cuál es la llave primaria de una tabla. La columna o combinación de columnas no debe tener valores duplicados ni nulos. Ejemplo

ALTER TABLE publicacion
ADD CONSTRAINT pk_publicacion
PRIMARY KEY CLUSTERED( pub_cod )

Establece que la columna pub_cod de la tabla publicacion es la llave primaria de la tabla. Crea un índice clustered único de nombre pk_publicación para la columna pub_cod.

La restricción UNIQUE (valores únicos)

Define que mas de una fila no pueden tener el mismo valor en una columna. Permite nulo. Ejemplo:

ALTER TABLE tema
ADD CONSTRAINT u_descripcion
UNIQUE NONCLUSTERED( tem_des )

Establece que la columna tem_des de la tabla tema no puede tener descripciones iguales. Crea un índice único de nombre u_descripcion.

La restricción FOREIGN KEY (llave foránea)

Define la integridad referencial. La restricción FOREIGN KEY se define sobre la columna llave foránea de la tabla secundaria. La tabla primaria debe tener definida su restricción PRIMARY KEY o UNIQUE. Ejemplo

ALTER TABLE ejemplar
ADD CONSTRAINT fk_ejemplar_publicacion
FOREIGN KEY( pub_cod )
REFERENCES publicacion( pub_cod )

Establece la relación entre las tablas publicacion y ejemplar.

Restricciones de integridad referencial en cascada

A partir de SQL Server 2000 es posible controlar las acciones que lleva a cabo SQL Server cuando se intenta actualizar o eliminar una clave a la que apuntan llaves foráneas externas existentes. Esto se controla mediante las nuevas cláusulas ON DELETE y ON UPDATE en la cláusula REFERENCES de las instrucciones CREATE TABLE y ALTER TABLE.

La cláusula ON DELETE controla las acciones que se llevarán a cabo si intenta eliminar una fila a la que apuntan las llaves foráneas existentes. La cláusula ON DELETE tiene dos opciones:

  • NO ACTION especifica que la eliminación produce un error.
  • CASCADE especifica que también se eliminan todas las filas con llaves foráneas que apuntan a la fila eliminada.

La cláusula ON UPDATE define las acciones que se llevarán a cabo si intenta actualizar un valor de clave candidata a la que apuntan las llaves foráneas existentes. También acepta las opciones NO ACTION y CASCADE.

Ejemplo:

ALTER TABLE ejemplar
ADD CONSTRAINT fk_ejemplar_publicacion
FOREIGN KEY( pub_cod )
REFERENCES publicacion( pub_cod )
ON DELETE CASCADE

Si se elimina una publicación, y ésta tiene ejemplares, también se eliminarán los ejemplares.

Deshabilitación de la verificación de las restricciones sobre la data existente

Cuando se define una restricción sobre una tabla que ya contiene datos, SQL Server verifica que la data cumple con los requerimientos de la restricción. Se puede deshabilitar la verificación de la data existente con la opción WITH NOCHECK, pero esto solo se aplica a las restricciones CHECK y FOREIGN KEY.

Ejemplo
ALTER TABLE prestamo
WITH NOCHECK
ADD CONSTRAINT chk_fecha_dev
CHECK ( DATEDIFF( dd , pre_fec_sal , pre_fec_dev ) <= 3 )

Deshabilitación de una restricción durante la carga de nuevos datos

En ocasiones, puede desear ingresar data que no cumple con las restricciones impuestas a una tabla. Para hacerlo, deberá desactivar la restricción, ingresar la data, y luego volver a activar la restricción. Lo anterior, solo se puede aplicar a las restricciones CHECK y FOREIGN KEY.

Ejemplo
ALTER TABLE ejemplar
NOCHECK
CONSTRAINT chk_disponibilidad

Cómo obtener información sobre las restricciones

Ejecute los procedimientos sp_helpconstraint o sp_help, o consulte las vistas de esquema de información check_constraints, referential_constraints, y table_constraints. Las tablas del sistema que guardan las definiciones de restricciones son: syscomments, sysreferences, y sysconstraints

Objetos DEFAULT (valor predeterminado) y RULE (regla de validación)

El valor predeterminado (default) y la regla de validación (rule) son objetos que pueden asociarse a una o más columnas o tipos de datos definidos por el usuario. Se definen una vez, y pueden utilizarse repetidamente. El uso de defaults y reglas tiene la desventaja de que no son estándares ANSI.

Uso del objeto DEFAULT (valor predeterminado)

Un objeto DEFAULT puede ser asociado a una o mas columnas o a tipos de datos definidos por el usuario; en otras palabras, el objeto se define una sola vez, y se puede usar con diferentes columnas en diferentes tablas. El objeto DEFAULT tiene la misma funcionalidad que la restricción DEFAULT.

Creación del objeto DEFAULT

CREATE DEFAULT nombre_default
AS valor_por_defecto

Ejemplo
CREATE DEFAULT dfo_disponibilidad
AS ‘S’

Asociación de un objeto DEFAULT con una columna o tipo de dato

sp_bindefault nombre_default , 'nombre_tabla.nombre_columna'

Si el segundo parámetro no tiene la forma tabla.columna, se asume que es un tipo de dato definido por el usuario.

Ejemplo
sp_bindefault dfo_disponibilidad , 'ejemplar.eje_dis'

Uso del objeto RULE (regla de validación)

Al igual que el objeto DEFAULT, el objeto RULE puede ser asociado a una o mas columnas o a tipos de datos definidos por el usuario. El objeto RULE tiene la misma funcionalidad que la restricción CHECK

Creación del objeto RULE

CREATE RULE nombre_rule
AS condición_regla

Ejemplo

CREATE RULE ru_monto_minimo
AS @monto = 5

Asociación de un objeto RULE con una columna o tipo de dato

sp_bindrule nombre_rule , 'nombre_tabla.nombre_columna'

Si el segundo parámetro no tiene la forma tabla.columna, se asume que es un tipo de dato definido por el usuario.

Ejemplo

sp_bindrule ru_monto_minimo , 'recibo.rec_mon'

Desligando un objeto DEFAULT o RULE de una columna o tipo de dato

Para desligar un objeto DEFAULT o un objeto RULE de una columna o de un tipo de dato definido por el usuario, utilice los procedimientos:

sp_unbindefault

ó

sp_unbindrule

Eliminación de los objetos DEFAULT y RULE

DROP DEFAULT nombre_default
DROP RULE nombre_rule

Un objeto que está asociado a una columna o a un tipo de dato definido por el usuario no puede ser eliminado

Impacto del método de diseño de integridad utilizado

Debe tenerse en cuenta la funcionalidad (control sobre la validez de la data), y la sobrecarga que se produce en el sistema al momento de decidir qué método de diseño de integridad de datos utilizar.

  • Se recomienda utilizar integridad declarativa (restricciones) para el diseño de la lógica de integridad básica, y el mantenimiento de las relaciones entre tablas.
  • Para el control de las operaciones en cascada se recomienda el uso de los triggers y los procedimientos almacenados.

La siguiente tabla muestra el impacto del diseño de integridad de datos sobre la funcionalidad de la base de datos, y sobre la carga al sistema.

Impacto del método de diseño

Publicar un comentario

Artículo Anterior Artículo Siguiente