triggers 2

Download Triggers 2

Post on 27-Oct-2014

42 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

EJERCICIOS TRIGGERS 2

Javier Garca Cambronel PRIMERO DE ASIR

[EJERCICIOS TRIGGERS 2]

1. En una tabla se recojan los ingresos y gastos producidos por cada tienda CONTROL_TIENDA(NIF, fecha_tran, total); cada vez que se produzca una venta o una compra de un artculo por una tienda se debe actualizar dicha tabla.

2. Las tiendas hacen pedidos; interesa slo servir a las tiendas que han pagado todos sus pedidos. Los pedidos pendientes de pago estn en una tabla PEDIDOS_PENDIENTES (son pedidos que se han servido pero cuyo pago no se ha efectuado). Los pedidos que hacen las tiendas con pedidos pendientes se almacenarn en otra tabla PEDIDOS_NOSERVIDOS. Cuando una tienda paga sus pedidos pendientes, estos pasan a la tabla PEDIDOS y sus pedidos no servidos pasan a la tabla PEDIDOS_PENDIENTES.

3. Extraer los beneficios por producto y tienda.

PRIMERO DE ASIR

Pgina 1

[EJERCICIOS TRIGGERS 2]

PREPARACIN PARA LA PRCTICACREAMOS LA BASE DE DATOS Y LAS TABLASLa cual todas las instrucciones se encuentran en el moodle en el siguiente enlace http://utopico.iesribera.edu.es:8080/moodle/mod/resource/view.php?inpopup=true&id=3 483 y son las siguientes, pero necesitaban alguna correccin tanto la tabla ventas como la tabla pedidos.

CDIGO DE CREACIN DE LAS TABLAS CORREGIDO

TABLA FABRICANTESCREATE TABLE FABRICANTES( COD_FABRICANTE NUMERIC(3) NOT NULL, NOMBRE NVARCHAR(15), PAIS NVARCHAR(15), CONSTRAINT PK_FABRICANTES PRIMARY KEY(COD_FABRICANTE)) ;

TABLA TIENDASCREATE TABLE TIENDAS( NIF NVARCHAR(10) NOT NULL, NOMBRE NVARCHAR(20), DIRECCIN NVARCHAR(20), POBLACIN NVARCHAR(20), PROVINCIA NVARCHAR(20), CODPOSTAL NUMERIC(5), CONSTRAINT PK_TIENDAS PRIMARY KEY(NIF));

TABLA ARTICULOSCREATE TABLE ARTICULOS( ARTICULO NVARCHAR(20)NOT NULL, COD_FABRICANTE NUMERIC(3) NOT NULL, PESO NUMERIC(3) NOT NULL , CATEGORIA NVARCHAR(10) NOT NULL, PRECIO_VENTA NUMERIC (4), PRECIO_COSTO NUMERIC (4), EXISTENCIAS NUMERIC (5), CONSTRAINT PK_ARTICULOS PRIMARY KEY (ARTICULO, COD_FABRICANTE), CONSTRAINT FK_ARTICULOS_COD_FABRICANTE FOREIGN KEY (COD_FABRICANTE) REFERENCES FABRICANTES);

PRIMERO DE ASIR

Pgina 2

[EJERCICIOS TRIGGERS 2]

TABLA VENTASCREATE TABLE VENTAS( NIF NVARCHAR(10) NOT NULL, ARTICULO NVARCHAR(20) NOT NULL, COD_FABRICANTE NUMERIC(3) NOT NULL, PESO NUMERIC(3) NOT NULL, CATEGORIA NVARCHAR(10) NOT NULL, FECHA_VENTA DATE NOT NULL, UNIDADES_VENDIDAS NUMERIC(4), CONSTRAINT PK_VENTAS PRIMARY KEY(NIF, ARTICULO, COD_FABRICANTE, FECHA_VENTA), CONSTRAINT FK_VENTAS_NIF FOREIGN KEY (NIF) REFERENCES TIENDAS, CONSTRAINT FK_VENTAS_ARTICULO FOREIGN KEY (ARTICULO, COD_FABRICANTE) REFERENCES ARTICULOS, CONSTRAINT FK_VENTAS_COD_FABRICANTE FOREIGN KEY (COD_FABRICANTE) REFERENCES FABRICANTES);

TABLA PEDIDOSCREATE TABLE PEDIDOS( NIF NVARCHAR(10) NOT NULL, ARTICULO NVARCHAR(20) NOT NULL, COD_FABRICANTE NUMERIC(3) NOT NULL, PESO NUMERIC(3) NOT NULL, CATEGORIA NVARCHAR(10) NOT NULL, FECHA_PEDIDO DATE NOT NULL, UNIDADES_PEDIDAS NUMERIC(4), CONSTRAINT PK_PEDIDOS PRIMARY KEY(NIF, ARTICULO, COD_FABRICANTE, FECHA_PEDIDO), CONSTRAINT FK_PEDIDOS_NIF FOREIGN KEY (NIF) REFERENCES TIENDAS, CONSTRAINT FK_PEDIDOS_ARTICULO FOREIGN KEY (ARTICULO,COD_FABRICANTE) REFERENCES ARTICULOS, CONSTRAINT FK_PEDIDOS_COD_FABRICANTE FOREIGN KEY (COD_FABRICANTE) REFERENCES FABRICANTES);

PRIMERO DE ASIR

Pgina 3

[EJERCICIOS TRIGGERS 2]

EJERCICIOS TRIGGERS 2Dada la base de datos de "tiendas, artculos, pedidos, ventas, fabricantes" que trabajamos en el captulo anterior. Te proponen ampliar su funcionalidad de forma que:

1. En una tabla se recojan los ingresos y gastos producidos por cada tienda CONTROL_TIENDA(NIF, fecha_tran, total); cada vez que se produzca una venta o una compra de un artculo por una tienda se debe actualizar dicha tabla.

CREAMOS LA TABLA CONTROL_TIENDACreamos la tabla donde se van a guardar los ingresos y gastos producidos por cada tienda, a esta tabla la damos el nombre como nos indica el ejercicio de CONTROL_TIENDA con los campos que se nos indican (NIF, FECHA_TRAN,TOTAL). CREATE TABLE CONTROL_TIENDA( NIF NVARCHAR(10), FECHA_TRAN DATETIME, TOTAL DECIMAL(18,0), CONSTRAINT PK_CLAVE PRIMARY KEY (NIF,FECHA_TRAN,TOTAL), CONSTRAINT FK_AJENA FOREIGN KEY (NIF) REFERENCES TIENDAS);

PRIMERO DE ASIR

Pgina 4

[EJERCICIOS TRIGGERS 2]

INTRODUCIMOS DATOS EN LAS TABLASTABLA TIENDAS: (NIF, NOMBRE, DIRECCIN, POBLACIN, PROVINCIA, CODPOSTAL) Insert into tiendas Values (123456,'APP','Santa Clara','Valladolid','Valladolid', 47010), (234567,'PCBOX','Hpica','Valladolid','Valladolid',47003), (345678,'PCCOSTE','Gondomar','Valladolid','Valladolid',47010), (456789,'JAVIPC','Plaza mayor','Valladolid','Valladolid',47002)

TABLA FABRICANTES: (COD_FABRICANTE,NOMBRE, PAIS) Insert into fabricantes Values(1 ,'Varios1', 'Espaa'), (2 ,'Varios2' ,'Espaa'), (3, 'Varios3', 'Espaa'), (4 ,'Varios4', 'Espaa')

PRIMERO DE ASIR

Pgina 5

[EJERCICIOS TRIGGERS 2]TABLA ARTICULOS: (ARTICULO, COD_FABRICANTE, PESO, CATEGORIA, PRECIO_VENTA, PRECIO_COSTO, EXISTENCIAS) Insert into Articulos Values ('T.sonido',1,5,'primera',50,20,20), ('T.grafica',2,10,'primera',100,60,20), ('Portatil',3,200,'segunda',600,400,10), ('Sobremesa',4,600,'segunda',700,500,10)

PRIMERO DE ASIR

Pgina 6

[EJERCICIOS TRIGGERS 2]

TRIGGER PARA CUANDO SE EFECTUAN VENTASPrimero creamos un trigger para cuando se realizan las ventas, con el nombre que queramos e indicando la tabla a la que hace referencia, lo segundo que le indicamos va a ser ante que operacin se va a llevar a cabo y va a entrar en funcionamiento INSERT, es decir despus de que se produzca un insert en la tabla ventas, se ejecutara el trigger en el cual indicamos a partir del begin que se inserte INSERT INTO en la tabla control_tienda el NIF, la fecha de transaccin y el total, para ello hacemos un SELECT de NIF, despus de Getdate() que insertara la fecha actual del sistema y por ltimo el TOTAL que viene dado por el precio de venta de cada unidad multiplicado por las unidades vendidas, dndonos as el valor total que han gastado en dicho pedido, Por ltimo tendramos que hacer la unin de las tablas correspondientes entre ARTICULOS Y VENTAS y la comparacin vara que los valores sean coherentes de ARTICULO CREATE TRIGGER dbo.mov ON VENTAS FOR INSERT AS BEGIN INSERT INTO CONTROL_TIENDA(NIF, FECHA_TRAN,TOTAL) SELECT NIF,GETDATE(),(PRECIO_VENTA*UNIDADES_VENDIDAS) FROM ARTICULOS INNER JOIN VENTAS ON ARTICULOS.ARTICULO=VENTAS.ARTICULO END

PRIMERO DE ASIR

Pgina 7

[EJERCICIOS TRIGGERS 2]

COMPROBACION DEL TRIGGER DE VENTASAhora lo que hacemos va a ser comprobar el funcionamiento, para ello insertamos en la tabla ventas un pedido, de los artculos que se encuentran en nuestra base de datos. INSERT INTO VENTAS VALUES (123456, 'T.sonido',1,5,'Primera','29-5-2012',2)

Comprobamos, consultando la tabla ventas, si se ha producido la insercin del pedido correctamente y vemos que as es.

Por ltimo comprobamos todos los elementos que se encuentran en la tabla control_tienda y vemos que se nos muestran perfectamente todos los datos, el NIF de la tienda, la FECHA de la transaccin y el TOTAL del importe.

PRIMERO DE ASIR

Pgina 8

[EJERCICIOS TRIGGERS 2]

TRIGGER PARA CUANDO SE EFECTUAN PEDIDOSComo vemos este trigger es muy parecido al anterior, le llamaremos en este caso mov1 y har referencia a la tabla PEDIDOS cuando en esta, se produzca la accion que le indicamos, en este caso como vemos, ante un INSERT Ahora vemos que las acciones del trigger son las mismas que en el anterior, es decir introducir los datos a la tabla CONTROL_TIENDA dichos datos del SELECT que indicamos los datos a recoger, con la nica diferencia con el anterior trigger en el que el TOTAL, se ver reflejado por el precio de costo multiplicado por las unidades pedidas. CREATE TRIGGER dbo.mov1 ON PEDIDOS FOR INSERT AS BEGIN INSERT INTO CONTROL_TIENDA(NIF, FECHA_TRAN,TOTAL) SELECT NIF,GETDATE(),(PRECIO_COSTO*UNIDADES_PEDIDAS) FROM ARTICULOS INNER JOIN PEDIDOS ON ARTICULOS.ARTICULO=PEDIDOS.ARTICULO END

PRIMERO DE ASIR

Pgina 9

[EJERCICIOS TRIGGERS 2]

COMPROBACION DEL TRIGGER DE PEDIDOSComprobamos el trigger y hacemos un pedido cualquiera, como el que vemos a continuacin. INSERT INTO PEDIDOS VALUES (123456, 'T.sonido',1,5,'Primera','29-5-2012',2)

Como podemos ver consultando la tabla pedidos, el pedido se ha llevado a cabo perfectamente.

Por ltimo comprobamos si esto tambin ha tendido efecto en la tabla control_tienda y como vemos as es.

PRIMERO DE ASIR

Pgina 10

[EJERCICIOS TRIGGERS 2]2. Las tiendas hacen pedidos; interesa slo servir a las tiendas que han pagado todos sus pedidos. Los pedidos pendientes de pago estn en una tabla PEDIDOS_PENDIENTES (son pedidos que se han servido pero cuyo pago no se ha efectuado). Los pedidos que hacen las tiendas con pedidos pendientes se almacenarn en otra tabla PEDIDOS_NOSERVIDOS. Cuando una tienda paga sus pedidos pendientes, estos pasan a la tabla PEDIDOS y sus pedidos no servidos pasan a la tabla PEDIDOS_PENDIENTES.

CREAMOS LA TABLA PEDIDOS_PENDIENTESCREATE TABLE PEDIDOS_PENDIENTES( NIF NVARCHAR(10) NOT NULL, ARTICULO NVARCHAR(20) NOT NULL, COD_FABRICANTE NUMERIC(3) NOT NULL, PESO NUMERIC(3) NOT NULL, CATEGORIA NVARCHAR(10) NOT NULL, FECHA_PEDIDO DATE NOT NULL, UNIDADES_PEDIDAS NUMERIC(4), PAGADO BIT DEFAULT 'FALSE' NOT NULL, CONSTRAINT PK_PEDIDOS_PENDIENTES PRIMARY KEY(NIF, ARTICULO, COD_FABRICANTE, FECHA_PEDIDO), CONSTRAINT FK_PEDIDOS_PENDIENTES_NIF FOREIGN KEY (NIF) REFERENCES TIENDAS, CONSTRAINT FK_PEDIDOS_PENDIENTES_ARTICULO FOREIGN KEY (ARTICULO,COD_FABRICANTE) REFERENCES ARTICULOS, CONSTRAINT FK_PEDIDOS_PENDIENTES_COD_FABRICANTE FOREIGN KEY (COD_FABRICANTE) REFERENCES FABRICANTES)

PRIMERO DE ASI