Después de las tablas, las vistas son las estructuras más utilizadas en bases de datos Oracle. Las ventajas respecto a utilizar directamente las tablas son muchas: nos permite filtrar la información dependiendo del usuario (sÃ, también se puede hacer con DBMS_RLT, pero esa es otra historia), “esconder” columnas dependiendo de quien haga la consulta, mostrar valores calculados, etc.
En un gran número de casos, las vistas son utilizadas únicamente como sistema de consulta. Es decir, defino qué información voy a mostrar y escribo la consulta que la obtiene. Este es el comportamiento más “lógico”, ya que al fin y al cabo, las vistas no son más que una SELECT almacenada en la base de datos.
Las vistas, definidas tanto de forma explÃcita como implÃcita, pueden ser utilicidas para realizar operaciones DML a través de ellas (siempre que cumplan una serie de condiciones). No voy a entrar en el fondo de la cuestión, ya que supondrÃa irme por las ramas. Simplemente, basta que se entienda que se puede realizar cualquier operación de modificación de datos a partir de la vista:
create view v_emp as select * from employees …
Un ejemplo de lo que digo podrÃa ser:
insert into v_emp (employee_id, first_name, …) values (232, ‘Pepito’, …);
Pues bien. La pregunta es ¿Qué pasa si la vista filtra los datos utilizando la cláusula WHERE? ¿Nos permitirá la vista insertar un valor que no cumpla con dicha cláusula? El ejemplo es claro; imaginemos que tenemos una vista que filtra por departamento, de la siguiente forma:
create view v_emp as select * from employees where department_id = 60;
¿Podremos insertar un empleado de un departamento diferente al 60? En contra de toda lógica, la respuesta es sÃ. De esta forma, podemos insertar un empleado que, posteriormente, no podremos consultar. Es muy sencillo, introducimos una fila a la que no tenemos acceso.
Evitaremos esto con la fórmula WITH CHECK OPTION. Escribiendo esta “palabra clave” (sÃ, es un keyword, aunque sean tres palabras) nos aseguraremos que no se inserta ningún valor que no cumpla con la condición del where. La forma correcta de escribir la vista enterior podrÃa ser:
create view v_emp as select * from employees where department_id = 60 with check option constraint emp_wcp_di;
La cláusula “constraint emp_wcp_di” da nombre a la constraint creada para garantizar el with check option. Es opcional, pero recomendable. Si no lo hacemos, Oracle creará una restricción que tendrá un nombre con la forma SYS_Cn, donde n es un número.








Suscribirse a nuestro Twitter
Javier Jofre (12-May-2010)
Gracias a O'Reilly, podemos asistir vÃa online y de forma gratuita a algunos cursos sobre desarrollo en Java para Android. Próximamente (en unos dÃas) empieza el curso de creación de un cliente twitter. Espero que lo disfrutéis.