88 - Vistas (with check option) |
Una empresa almacena la información de sus empleados en una tabla llamada "empleados".
Eliminamos la tabla:
drop table empleados;
Creamos la tabla:
create table empleados( documento char(8), sexo char(1) constraint CK_empleados_sexo check (sexo in ('f','m')), apellido varchar2(20), nombre varchar2(20), seccion varchar2(30), cantidadhijos number(2), constraint CK_empleados_hijos check (cantidadhijos>=0), estadocivil char(10) constraint CK_empleados_estadocivil check (estadocivil in ('casado','divorciado','soltero','viudo')) );
Ingresamos algunos registros:
insert into empleados values('22222222','f','Lopez','Ana','Administracion',2,'casado'); insert into empleados values('23333333','m','Lopez','Luis','Administracion',0,'soltero'); insert into empleados values('24444444','m','Garcia','Marcos','Sistemas',3,'divorciado'); insert into empleados values('25555555','m','Gomez','Pablo','Sistemas',2,'casado'); insert into empleados values('26666666','f','Perez','Laura','Contaduria',3,'casado');
Creamos o reemplazamos (si existe) la vista "vista_empleados", para que muestre el nombre, apellido, sexo y sección de todos los empleados de "Administracion" agregando la cláusula "with check option" para evitar que se modifique la sección de tales empleados a través de la vista y que se ingresen empleados de otra sección:
create or replace view vista_empleados as select apellido, nombre, sexo, seccion from empleados where seccion='Administracion' with check option;
Consultamos la vista:
select *from vista_empleados;
Actualizarmos el nombre de un empleado a través de la vista:
update vista_empleados set nombre='Beatriz' where nombre='Ana';
Oracle aceptó la actualización porque el campo "nombre" no está restringido.
Veamos si la modificación se realizó en la tabla:
select *from empleados;
Intentamos actualizar la sección de un empleado a través de la vista:
update vista_empleados set seccion='Sistemas' where nombre='Beatriz';
Oracle no aceptó la actualización porque el campo "nombre" está restringido.
Ingresamos un registro mediante la vista:
insert into vista_empleados values('Gomez','Gabriela','f','Administracion');
Oracle acepta la inserción porque ingresamos un valor para "seccion" que incluirá el registro en la vista.
Intentamos ingresar un empleado de otra sección:
insert into vista_empleados values('Torres','Tatiana','f','Sistemas');
Oracle no acepta la inserción porque ingresamos un valor para "seccion" que excluirá el nuevo registro de la vista.
drop table empleados; create table empleados( documento char(8), sexo char(1) constraint CK_empleados_sexo check (sexo in ('f','m')), apellido varchar2(20), nombre varchar2(20), seccion varchar2(30), cantidadhijos number(2), constraint CK_empleados_hijos check (cantidadhijos>=0), estadocivil char(10) constraint CK_empleados_estadocivil check (estadocivil in ('casado','divorciado','soltero','viudo')) ); insert into empleados values('22222222','f','Lopez','Ana','Administracion',2,'casado'); insert into empleados values('23333333','m','Lopez','Luis','Administracion',0,'soltero'); insert into empleados values('24444444','m','Garcia','Marcos','Sistemas',3,'divorciado'); insert into empleados values('25555555','m','Gomez','Pablo','Sistemas',2,'casado'); insert into empleados values('26666666','f','Perez','Laura','Contaduria',3,'casado'); -- Creamos o reemplazamos (si existe) la vista "vista_empleados", para que muestre el nombre, -- apellido, sexo y sección de todos los empleados de "Administracion" agregando la cláusula -- "with check option" para evitar que se modifique la sección de tales empleados -- a través de la vista y que se ingresen empleados de otra sección: create or replace view vista_empleados as select apellido, nombre, sexo, seccion from empleados where seccion='Administracion' with check option; -- Consultamos la vista: select *from vista_empleados; -- Actualizarmos el nombre de un empleado a través de la vista: update vista_empleados set nombre='Beatriz' where nombre='Ana'; -- Oracle aceptó la actualización porque el campo "nombre" no está restringido. -- Veamos si la modificación se realizó en la tabla: select *from empleados; -- Intentamos actualizar la sección de un empleado a través de la vista: update vista_empleados set seccion='Sistemas' where nombre='Beatriz'; -- Oracle no aceptó la actualización porque el campo "nombre" está restringido. -- Ingresamos un registro mediante la vista: insert into vista_empleados values('Gomez','Gabriela','f','Administracion'); -- Oracle acepta la inserción porque ingresamos un valor para "seccion" -- que incluirá el registro en la vista. -- Intentamos ingresar un empleado de otra sección: insert into vista_empleados values('Torres','Tatiana','f','Sistemas');
La ejecución de este lote de comandos SQL genera una salida similar a: