English version (when available)
create or replace view VusuAli as select * from tiendaonline.usuario where provincia='03';Como solo tienes permisos de lectura en TIENDAONLINE solo eso puedes hacer en esta vista, consultar.
select * from VusuAli order by apellidos,nombre;
select * from VusuAli where nombre in ('Carolina','Iloveny') order by apellidos,nombre;
delete from VusuAli where nombre in ('Carolina','Iloveny');Esta orden falla.
insert into VusuAli (email,dni,apellidos,nombre,provincia,pueblo) values ('yoyo@gmial.es','99888777R','FERNANDEZ FERNANDEZ','ROSA','04','1225'); -- esta orden fallará porque no tenemos permisos de inserción en la base de datos tiendaonline.Esta orden falla.
create or replace view Tpedidos as select p.numpedido,sum(importe*cantidad) total,date(fecha) from tiendaonline.pedido p, tiendaonline.linped l where p.numpedido=l.numpedido group by p.numpedido,fecha; --comprobamos que la consulta y la vista obtienen el mismo resultado select p.numpedido,sum(importe*cantidad) total,date(fecha) from tiendaonline.pedido p, tiendaonline.linped l where p.numpedido=l.numpedido group by p.numpedido,fecha; select * from Tpedidos;
select u.email,u.apellidos,u.nombre,pp.pagado from VusuAli u left join ( select usuario, sum(total) pagado from tiendaonline.pedido p -- necesitamos esta tabla porque la vista Tpedidos no incluye la información de usuario join Tpedidos t on p.numpedido=t.numpedido group by usuario ) pp on pp.usuario=u.emailSi la vista no tiene toda la información necesaria, no hay problema en recurrir a las tablas del esquema de base de datos de trabajo.
create or replace view TApedidos as select p.numpedido,sum(importe*cantidad) total,date(fecha),usuario from tiendaonline.pedido p join tiendaonline.linped l on p.numpedido=l.numpedido where usuario in (select email from tiendaonline.usuario where provincia='03') group by p.numpedido,date(fecha),usuario;En esta vista estamos limitando la información a únicamente pedidos hechos por usuarios de Alicante.
select u.email,u.apellidos,u.nombre,pp.total from VusuAli u left join TApedidos pp on pp.usuario=u.email;El objetivo de estos ejercicios es que te des cuenta de lo que puedes añadir a una vista en función de la consulta que quieras diseñar y los requisitos de seguridad que pudieras querer imponer a los que usen esas vistas.
Fíjate que no hemos necesitado filtrar nada, las vistas ya trabajan únicamente con datos de usuarios de Alicante.
create table usuAlm like tiendaonline.usuario; -- esto crea una tabla idéntica excepto en las claves ajenas que, para añadirlas, habría que usar ALTER TABLE create view VusuAlm as select * from usuAlm where provincia='04' with check option; -- CHECK OPTION es necesario para evitar que se puedan insertar usuarios de otras provinciasTanto la tabla base como la vista pertenecen a tu base de datos y, por tanto, tienes todos los permisos necesarios para trabajar con ellas.
Podemos pensar que el objetivo es permitir la gestión de nuestra tabla USUARIO mediante la vista, eso nos asegura que solo se podrán manejar datos de usuarios de Almería.
insert into VusuAlm (email,dni,apellidos,nombre,provincia,pueblo) values ('rgg2@gmial.es','11222333R','GOMEZ GOMEZ','ROSA','04','1002'); -- hemos podido insertar porque la tabla base (usuAlm) está en nuestra base de datos, y tenemos permiso para ello
delete from VusuAlm; insert into VusuAlm (email,dni,apellidos,nombre,provincia,pueblo) values ('rff20@gmial.es','11222333R','FERNANDEZ FERNANDEZ','ROSA','04','0530'), ('jmm119@gmial.es','22333444T','MARTINEZ MARTINEZ','JULIA','04','1002');
insert into VusuAlm (email,dni,apellidos,nombre,provincia,pueblo) values ('tutu@gmial.es','00999000T','LOPEZ DE LOPEZ','ANA','03','1225'); -- Estamos intentando insertar una usuaria de Alicante ('03'), pero la vista no permite otra provincia que Almeria ('04') por el CHECK OPTION
ALTER TABLE usuAlm ADD FOREIGN KEY (pueblo, provincia) REFERENCES tiendaonline.localidad (codm,provincia); create table pedidosAlm like tiendaonline.pedido; alter table pedidosAlm add foreign key (usuario) references usuAlm(email); create table lineasAlm like tiendaonline.linped; alter table lineasAlm add foreign key (numpedido) references pedidosAlm(numpedido); alter table lineasAlm add foreign key (articulo) references tiendaonline.articulo(cod); insert into pedidosAlm (numpedido, usuario, fecha) values (1,'rff20@gmial.es',now()); insert into lineasAlm (numpedido,linea,articulo,cantidad,importe) values (1,1,'A0685',10,100),(1,2,'A1234',2,10); -- comprobamos los datos select * from usuAlm; select * from pedidosAlm; select * from lineasAlm; select * from cestasAlm;
select email,apellidos,u.nombre,p.nombre,l.pueblo from tiendaonline.localidad l, tiendaonline.provincia p, ( select email,apellidos,nombre,provincia,pueblo from VusuAlm UNION select email,apellidos,nombre,provincia,pueblo from tiendaonline.usuario ) u where u.provincia=l.provincia and u.pueblo=l.codm and l.provincia=p.codp;
create or replace view TApedidosAlm as select p.numpedido,sum(importe*cantidad) total,date(fecha),usuario from pedidosAlm p join lineasAlm l on p.numpedido=l.numpedido group by p.numpedido,date(fecha),usuario; -- comprobando select * from TApedidosAlm;
select email, nombre, apellidos, p.numpedido,total from VusuAlm u left join TApedidosAlm p on u.email=p.usuario;