Está en la página 1de 12

EJERCICIO TRIGGERS

Javier Garca Cambronel


PRIMERO DE ASIR
[EJERCICIO TRIGGERS 1]

PREPARACIN PARA LA PRCTICA

PROBAMOS EL EJERCICIO PRCTICO

1.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 PRCTICA


CREAMOS LA BASE DE DATOS
Lo 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 TABLAS


Ahora 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 ARTICULOS


Ahora 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


ARTCULOS
Creamos 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 PRCTICO


INSERCION TIPO INPUT
Lo 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 EFECTOS


Mostremos 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 OUTPUT


Insertamos 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 EFECTOS


En 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 EFECTUADAS


Eliminamos 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 EFECTOS


Mostremos 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


MOVIMIENTOS
Eliminamos 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 EFECTOS


Mostramos 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

También podría gustarte