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.

Ingresemos el siguiente lote de comandos en el Oracle SQL Developer:

 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:

SQL Developer view con with read only


Retornar