Listado completo de tutoriales
86 - Vistas (with read only) |
Con la cláusula "with read only" (sólo lectura) evitamos que se puedan realizar inserciones, actualizaciones y eliminaciones mediante una vista.
Sintaxis:
create view NOMBREVISTA as SUBCONSULTA with read only;
Evitamos que Oracle acepte "insert", "update" o "delete" sobre la vista si colocamos "with read only" luego de la subconsulta que define una vista.
Por ejemplo, creamos la siguiente vista:
create view vista_empleados as select apellido, nombre, sexo, seccion from empleados with read only;
Oracle responde con un mensaje de error ante cualquier "insert", "update" o "delete" realizado sobre 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),
domicilio varchar2(30),
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')),
fechaingreso date
);
insert into empleados
values('22222222','f','Lopez','Ana','Colon 123','Administracion',2,'casado','10/10/1990');
insert into empleados
values('23333333','m','Lopez','Luis','Sucre 235','Administracion',0,'soltero','02/10/1990');
insert into empleados
values('24444444','m','Garcia','Marcos','Sarmiento 1234','Contaduria',3,'divorciado','07/12/1998');
insert into empleados
values('25555555','m','Gomez','Pablo','Bulnes 321','Contaduria',2,'casado','10/09/1998');
insert into empleados
values('26666666','f','Perez','Laura','Peru 1254','Sistemas',3,'casado','05/09/2000');
-- Eliminamos las vistas "vista_empleados" y "vista_empleados2":
drop view vista_empleados;
drop view vista_empleados2;
-- Creamos la vista "vista_empleados", que muestra solamente algunos campos de "empleados":
create view vista_empleados
as
select apellido, nombre, sexo, seccion
from empleados;
-- Creamos la vista "vista_empleados2", igual que "vista_empleados", pero ahora colocamos
-- "with read only" para impedir que puedan ejecutarse "insert", "update" y "delete" sobre esta vista:
create view vista_empleados2
as
select apellido, nombre, sexo, seccion
from empleados
with read only;
-- Actualizamos el nombre de un empleado a través de la vista "vista_empleados":
update vista_empleados set nombre='Beatriz' where nombre='Ana';
-- Veamos si la modificación se realizó en la tabla:
select *from empleados;
-- Intentamos actualizar el nombre de un empleado a través de la vista "vista_empleados2":
update vista_empleados2 set nombre='Pedro' where nombre='Marcos';
-- No lo permite.
-- Ingresamos un registro en la tabla "empleados" a través de la vista "vista_empleados":
insert into vista_empleados values('Juarez','Juan','m','Sistemas');
-- Oracle acepta la inserción. Verificamos que la inserción se realizó en la tabla:
select *from empleados;
-- Intentamos ingresar un registro a través de la vista "vista_empleados2":
insert into vista_empleados2 values('Gimenez','Julieta','f','Sistemas');
-- Oracle no lo permite porque la vista fue definida con "with read only".
-- Eliminamos un registro en la tabla "empleados" a través de la vista "vista_empleados":
delete from vista_empleados where apellido='Juarez';
-- Oracle acepta la eliminación. Verificamos que la eliminación se realizó en la tabla:
select *from empleados;
-- Intentamos eliminar registros a través de la vista "vista_empleados2":
delete from vista_empleados2 where apellido='Lopez';
-- Oracle no lo permite porque la vista fue definida con "with read only".
La ejecución de este lote de comandos SQL genera una salida similar a:
