13
  IOIUA@A@M [U@GGIUQ : Ojv`ir Gjraãj Ajcermnib TU@CIUM KI JQ@U

Triggers 1

Embed Size (px)

Citation preview

EJERCICIO TRIGGERS 1

Javier Garca Cambronel PRIMERO DE ASIR

[EJERCICIO TRIGGERS 1]

PREPARACIN PARA LA PRCTICA

PROBAMOS EL EJERCICIO PRCTICO1.INSERCION TIPO INPUT 2.INSERCIONES TIPO INPUT Y OUTPUT 3.ELIMINAR TRANSACCIONES EFECTUADAS 4.COMPORTAMIENTO AL DESACTIVAR TRIGGERS DE LA TABLA MOVIMIENTOS

PRIMERO DE ASIR

Pgina 1

[EJERCICIO TRIGGERS 1]

PREPARACIN PARA LA PRCTICACREAMOS LA BASE DE DATOSLo primero que hacemos es crear la base de datos, si ya existe, lo que hace el siguiente cdigo es borrarla y volverla a crear, con el nombre que vemos StockArticulos USE master GO IF EXISTS (SELECT NAME FROM sys.databases WHERE name = 'StockArticulos') BEGIN DROP DATABASE StockArticulos END CREATE DATABASE StockArticulos GO Ejecutamos el cdigo.

Una vez ejecutado el cdigo vemos como se ha creado la base de datos perfectamente.

PRIMERO DE ASIR

Pgina 2

[EJERCICIO TRIGGERS 1]

CREAMOS LAS TABLASAhora lo que hacemos con el siguiente cdigo es usar la base de datos que acabamos de crear y crear las tablas Artculos y Movimientos con las caractersticas de cada una en cada campo que las forman como vemos en la tabla Movimientos, existe una restriccin tipo check , lo que quiere decir que en esa columna slo podr tener datos tipo 'I' o de tipo 'O'

USE StockArticulos GO CREATE TABLE dbo.Articulos (ID INT PRIMARY KEY, NOMBRE VARCHAR(100),STOCK DECIMAL (18,2)) GO CREATE TABLE dbo.Movimientos (TRANSACCION INT,FECHA DATE DEFAULT(GETDATE()),ARTICULO_ID INT FOREIGN KEY REFERENCES DBO.ARTICULOS(ID),CANTIDAD DECIMAL(18,2), TIPO CHAR(1) CHECK (TIPO ='I' OR TIPO = 'O')) GO Vemos que el cdigo se ejecuta perfectamente.

Comprobamos que despus de ejecutar el cdigo abrimos la base de datos StockArticulos y comprobamos que las tablas se han creado perfectamente.

PRIMERO DE ASIR

Pgina 3

[EJERCICIO TRIGGERS 1]

INSERTAMOS LOS DATOS EN ARTICULOSAhora insertamos los datos en la tabla artculos de estos tres elementos (monitores, CPU, mouse) INSERT INTO dbo.Articulos(ID,NOMBRE,STOCK) VALUES (1,'Monitores',0),(2,'CPU',0),(3,'Mouse',0) GO

Hacemos la seleccin correspondiente para ver si se han creado y vemos que as es.

PRIMERO DE ASIR

Pgina 4

[EJERCICIO TRIGGERS 1]

CREAMOS DE LOS TRIGGERS PARA TENER ACTUALIZADOS LOS ARTCULOSCreamos el trigger para cuando se produzca la accin insert el cual, como podemos ver en el cdigo actualizara la tabla artculos el campo stock ser a Stock+t.parcial hacemos el inner join correspondiente, seleccionando el id del artculo y los casos incluidos para tipo I o para tipo O. CREATE TRIGGER dbo.MovimientosInsert ON dbo.Movimientos FOR INSERT AS BEGIN SET NOCOUNT ON UPDATE DBO.ARTICULOS SET STOCK = STOCK + T.PARCIAL FROM DBO.ARTICULOS A INNER JOIN ( SELECT ARTICULO_ID, SUM(CASE WHEN TIPO='I' THEN CANTIDAD ELSE CANTIDAD END) AS PARCIAL FROM INSERTED GROUP BY ARTICULO_ID) AS T ON A.ID = T.ARTICULO_ID END GO Vemos que el trigger se crea perfectamente

PRIMERO DE ASIR

Pgina 5

[EJERCICIO TRIGGERS 1]Como podemos ver, este trigger es casi idntico al anterior en cuestin estructural, pero como vemos, este entra en el caso de DELETE y el Stock ser Stock-t.parcial es decir los triggers que hemos utilizado, van a actualizar el Stock, a partir de la tabla movimientos.

CREATE TRIGGER dbo.MovimientosDelete ON dbo.Movimientos FOR DELETE AS BEGIN SET NOCOUNT ON UPDATE dbo.Articulos SET STOCK = STOCK - T.PARCIAL FROM dbo.Articulos A INNER JOIN( SELECT ARTICULO_ID,SUM(CASE WHEN TIPO='I' THEN CANTIDAD ELSE CANTIDAD END) AS PARCIAL FROM DELETED GROUP BY ARTICULO_ID) AS T ON A.ID = T.ARTICULO_ID END GO

Vemos que el trigger se crea perfetamente

PRIMERO DE ASIR

Pgina 6

[EJERCICIO TRIGGERS 1]

PROBAMOS EL EJERCICIO PRCTICOINSERCION TIPO INPUTLo primero que haremos ser mostrar el stock actual de los artculos que tenemos, para ello hacemos el select correspondiente. SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A

Insertamos un registro para el artculo uno indicando que la cantidad de estos artculos los cuales son monitores es de 100 INSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO) VALUES (1,1,GETDATE(),100,I')

COMPROBAMOS LOS EFECTOSMostremos el Stock actual para el ID 1, es decir para monitores y comprobaremos que los datos de stock de monitores se han actualizado y estn en 100. SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A WHERE A.ID = 1

PRIMERO DE ASIR

Pgina 7

[EJERCICIO TRIGGERS 1]

INSERCIONES TIPO INPUT Y OUTPUTInsertamos ms registros para comprobar sus efectos, con el siguiente comando y vemos que los cambios afectan a tres filas. INSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO) VALUES (2,1,GETDATE(),10,'I'), (3,1,GETDATE(),5,'O'), (4,2,GETDATE(),5,'I')

COMPROBAMOS LOS EFECTOSEn el anterior INSERT se introducen dos valores para el stock del artculo 1 es decir, los monitores, que son 10 del tipo I y 5 de tipo O, que en total seran 15, pero en el resultado slo aparecen 5 (mas los 100 anteriores). Los del tipo 'O', resten esa cantidad. Por eso (10 - 5 = 5) el resultado es 105.00 y los cinco del tipo I para el artculo 2 CPU se han sumado, dando un total de cinco en stock.

PRIMERO DE ASIR

Pgina 8

[EJERCICIO TRIGGERS 1]

ELIMINAR TRANSACCIONES EFECTUADASEliminamos la transaccion (1) de cantidad = 100 DELETE FROM dbo.Movimientos WHERE TRANSACCION = 1

Eliminemos la transaccin (3) de cantidad = 5 DELETE FROM dbo.Movimientos WHERE TRANSACCION = 3

COMPROBAMOS LOS EFECTOSMostremos el stock actual de la tabla Artculos y vemos que ahora el resultado, es como si las operaciones que hemos borrado, nunca hubieran sucedido, y as se obtienen los resultados que vemos los pertenecientes a la transaccin 2 referente artculo 1 Monitores y a la transaccin 4 referente al artculo 2 CPU. SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A

PRIMERO DE ASIR

Pgina 9

[EJERCICIO TRIGGERS 1]

COMPORTAMIENTO AL DESACTIVAR LOS TRIGGERS DE LA TABLA MOVIMIENTOSEliminamos todos los movimientos realizados DELETE FROM dbo.Movimientos

Deshabilitamos los triggers ALTER TABLE dbo.Movimientos DISABLE TRIGGER ALL

Mostremos lo que pasa se insertamos un registro en la tabla movimientos que tiene deshabilitados los triggers. INSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO) VALUES (1,1,GETDATE(),100,I')

PRIMERO DE ASIR

Pgina 10

[EJERCICIO TRIGGERS 1]

COMPROBAMOS LOS EFECTOSMostramos el stock actual de la tabla Artculos y comprobamos que al desactivar los Triggers ya no se actualizan los datos de la tabla artculos, por lo que los datos son los del inicio

SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A

PRIMERO DE ASIR

Pgina 11