41 - Restricciones: validación y estados (validate - novalidate - enable - disable) |
Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados".
1- Elimine la tabla:
drop table empleados;
2- Créela con la siguiente estructura e ingrese los registros siguientes:
create table empleados ( codigo number(6), documento char(8), nombre varchar2(30), seccion varchar2(20), sueldo number(6,2) ); insert into empleados values (1,'22222222','Alberto Acosta','Sistemas',-10); insert into empleados values (2,'33333333','Beatriz Benitez','Recursos',3000); insert into empleados values (3,'34444444','Carlos Caseres','Contaduria',4000);
3- Intente agregar una restricción "check" para asegurarse que no se ingresen valores negativos para el sueldo sin especificar validación ni estado:
alter table empleados add constraint CK_empleados_sueldo_positivo check (sueldo>=0);
No se permite porque hay un valor negativo almacenado y por defecto la opción es "validate".
5- Vuelva a intentarlo agregando la opción "novalidate".
6- Intente ingresar un valor negativo para sueldo.
7- Deshabilite la restricción e ingrese el registro anterior.
8- Intente establecer una restricción "check" para "seccion" que permita solamente los valores "Sistemas", "Administracion" y "Contaduría" sin especificar validación:
alter table empleados add constraint CK_empleados_seccion_lista check (seccion in ('Sistemas','Administracion','Contaduria'));
No lo permite porque existe un valor fuera de la lista.
9- Establezca la restricción anterior evitando que se controlen los datos existentes.
10- Vea si las restricciones de la tabla están o no habilitadas y validadas.
Muestra 2 filas, una por cada restricción; ambas son de control, ninguna valida los datos existentes, "CK_empleados_sueldo_positivo" está deshabilitada, la otra habilitada.
11- Habilite la restricción deshabilitada.
Note que existe un sueldo que infringe la condición.
12- Intente modificar la sección del empleado "Carlos Caseres" a "Recursos"
No lo permite.
13- Deshabilite la restricción para poder realizar la actualización del punto precedente.
14- Agregue una restricción "primary key" para el campo "codigo" deshabilitada.
15- Ingrese un registro con código existente.
16- Intente habilitar la restricción.
No se permite porque aun cuando se especifica que no lo haga, Oracle verifica los datos existentes, y existe un código repetido.
17- Modifique el registro con clave primaria repetida.
18- Habilite la restricción "primary key"
19- Agregue una restricción "unique" para el campo "documento"
20- Vea todas las restricciones de la tabla "empleados"
Muestra las 4 restricciones: 2 de control (1 habilitada y la otra no, no validan datos existentes), 1 "primary key" (habilitada y no valida datos existentes) y 1 única (habilitada y valida los datos anteriores).
21- Deshabilite todas las restricciones de "empleados"
22- Ingrese un registro que viole todas las restricciones.
23- Habilite la restricción "CK_empleados_sueldo_positivo" sin validar los datos existentes.
24- Habilite la restricción "CK_empleados_seccion_lista" sin validar los datos existentes.
25- Intente habilitar la restricción "PK_empleados_codigo" sin validar los datos existentes.
26- Intente habilitar la restricción "UQ_empleados_documento" sin validar los datos existentes.
27- Elimine el registro que infringe con las restricciones "primary key" y "unique".
28- Habilite las restricciones "PK_empleados_codigo" y "UQ_empleados_documento" sin validar los datos existentes.
29- Consulte el catálogo "user_constraints" y analice la información.
Ver solucióndrop table empleados; create table empleados ( codigo number(6), documento char(8), nombre varchar2(30), seccion varchar2(20), sueldo number(6,2) ); insert into empleados values (1,'22222222','Alberto Acosta','Sistemas',-10); insert into empleados values (2,'33333333','Beatriz Benitez','Recursos',3000); insert into empleados values (3,'34444444','Carlos Caseres','Contaduria',4000); alter table empleados add constraint CK_empleados_sueldo_positivo check (sueldo>=0); alter table empleados add constraint CK_empleados_sueldo_positivo check (sueldo>=0) novalidate; insert into empleados values (4,'35555555','Daniel Duarte','Administracion',-2000); alter table empleados disable novalidate constraint CK_empleados_sueldo_positivo; insert into empleados values (4,'35555555','Daniel Duarte','Administracion',-2000); alter table empleados add constraint CK_empleados_seccion_lista check (seccion in ('Sistemas','Administracion','Contaduria')); alter table empleados add constraint CK_empleados_seccion_lista check (seccion in ('Sistemas','Administracion','Contaduria')) novalidate; select constraint_name, constraint_type, status, validated from user_constraints where table_name='EMPLEADOS'; alter table empleados enable novalidate constraint CK_empleados_sueldo_positivo; update empleados set seccion='Recursos' where nombre='Carlos Caseres'; alter table empleados disable novalidate constraint CK_empleados_seccion_lista; update empleados set seccion='Recursos' where nombre='Carlos Caseres'; alter table empleados add constraint PK_empleados_codigo primary key (codigo) disable; insert into empleados values (4,'22333444','Federico Fuentes',null,null); alter table empleados enable novalidate constraint PK_empleados_codigo; update empleados set codigo=5 where nombre='Federico Fuentes'; alter table empleados enable novalidate constraint PK_empleados_codigo; alter table empleados add constraint UQ_empleados_documento unique(documento); select constraint_name, constraint_type, status, validated from user_constraints where table_name='EMPLEADOS'; alter table empleados disable constraint PK_empleados_codigo; alter table empleados disable constraint UQ_empleados_documento; alter table empleados disable constraint CK_empleados_sueldo_positivo; alter table empleados disable constraint CK_empleados_seccion_lista; insert into empleados values (1,'33333333','Federico Fuentes','Gerencia',-1500); alter table empleados enable novalidate constraint CK_empleados_sueldo_positivo; alter table empleados enable novalidate constraint CK_empleados_seccion_lista; alter table empleados enable novalidate constraint PK_empleados_codigo; alter table empleados enable novalidate constraint UQ_empleados_documento; delete empleados where seccion='Gerencia'; alter table empleados enable novalidate constraint PK_empleados_codigo; alter table empleados enable novalidate constraint UQ_empleados_documento; select constraint_name, constraint_type, status, validated from user_constraints where table_name='EMPLEADOS';