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:
