41 - Restricciones: validación y estados (validate - novalidate - enable - disable)


Primer problema:

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ón

  drop 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';

 


Retornar