41 - Restricciones: validación y estados (validate - novalidate - enable - disable) |
Sabemos que si agregamos una restricción a una tabla que contiene datos, Oracle los controla para asegurarse que cumplen con la condición de la restricción, si algún registro no la cumple, la restricción no se establecece.
Es posible deshabilitar esta comprobación estableciendo una restricción sin comprobar los datos existentes en la tabla.
Podemos hacerlo cuando agregamos la restricción (de cualquier tipo) a una tabla para que Oracle acepte los valores ya almacenados que infringen la restricción. Para ello debemos incluir la opción "novalidate" en la instrucción "alter table":
alter table libros add constraint PK_libros_codigo primary key (codigo) novalidate;
La restricción no se aplica en los datos existentes, pero si intentamos ingresar un nuevo valor que no cumpla la restricción (o actualizarlo), Oracle no lo permite.
Para saber si una restricción está validada o no, podemos consultar el catálogo "user_constraints" y fijarnos lo que informa la columna "validated".
También podemos deshabilitar las restricciones para agregar o actualizar datos sin comprobarla:
alter table libros add constraint PK_libros_codigo primary key (codigo) disable;
Entonces, para evitar la comprobación de datos existentes y futuros al crear la restricción, la sintaxis básica es la siguiente:
alter table TABLA add constraint NOMBRERESTRICCION TIPOdeRESTRICCION (CAMPO o CONDICION)--campo si es primary key o unique; condición si es check disable novalidate;
Por defecto (si no especificamos) la opción es "validate", es decir, controla los datos existentes y "enable", es decir, controla futuros ingresos y actualizaciones.
También es posible alterar la restricción luego de haberla creado. Sintaxis:
alter table NOMBRETABLA ESTADO VALIDACION constraint NOMBRERESTRICCION;
En el ejemplo siguiente deshabilitamos la restricción "PK_libros_codigo" para poder ingresar un valor que infrija la restricción:
alter table libros disable validate constraint PK_libros_codigo;
Para habilitar una restricción deshabilitada se ejecuta la misma instrucción pero con la cláusula "enable":
alter table libros enable validate constraint PK_libros_codigo;
Para saber si una restricción está habilitada o no, podemos consultar el catálogo "user_constraints" y fijarnos lo que informa la columna "status".
Los estados "validate" y "novalidate" son relativamente independientes de los estados "enabled" y "disabled".
Cuando habilitamos una restricción "primary key" o "unique" con "enable", los datos existentes DEBEN cumplir con la restricción; aunque coloquemos "novalidate" junto a "enable", Oracle no permite que se habilite la restrición y valida los datos existentes de todas maneras. No sucede lo mismo con una restricción "check"; podemos habilitar una restricción de control con "enable" y "novalidate", Oracle habilita la restricción para futuros ingresos y actualizaciones y NO valida los datos existentes.
Entonces, "enable" o "disable" activa o desactiva la restricción para los nuevos datos ("enable" es la opción predeterminada si no se especifica); "validate" o "novalidate" es la opción para validar la restricción en los datos existentes ("validate" es la predetermidada si se omite).
Una restricción puede estar en los siguientes estados:
- validate y enabled: comprueba los valores existentes y los posteriores ingresos y actualizaciones;
- validate y disable: comprueba los valores existentes pero no las posteriores inserciones y actualizaciones;
- novalidate y enabled: no comprueba los datos existentes, pero si los posteriores ingresos y actualizaciones;
- novalidate y disabled: no comprueba los valores existentes ni los posteriores ingresos y actualizaciones.