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
Carlos (02-Aug-2010)
A trav茅s de la p谩gina en FaceBook de BalearesON, Dar铆o ha enlazado una aplicaci贸n de canal del tiempo para Surface. Muy interesante.