Sie sind auf Seite 1von 6

USE master

GO
IF EXISTS (SELECT NAME FROM sys.databases
WHERE name = StockArticulos)
BEGIN
DROP DATABASE StockArticulos
END
CREATE DATABASE StockArticulos
GO
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
Insertamos registros a la tabla Articulos
INSERT INTO dbo.Articulos(ID,NOMBRE,STOCK) VALUES (1,Monitores,0),(2,CPU,0),(3,Mouse,0)
GO
Creamos los triggers para tener actualizado los articulos
CREATE TRIGGER dbo.MovimientosInsert ON dbo.Movimientos
FOR INSERT
AS
BEGIN
No retorna el mensaje de cantidad de registros afectados
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
)T

ON
A.ID = T.ARTICULO_ID
END
GO
CREATE TRIGGER dbo.MovimientosDelete ON dbo.Movimientos
FOR DELETE
AS
BEGIN
No retorna el mensaje de cantidad de registros afectados
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
)T
ON
A.ID = T.ARTICULO_ID
END
GO
Probemos el ejercicio
Mostremos el Stock actual
SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A
Insertemos un registro para el articulo 1
INSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO)
VALUES (1,1,GETDATE(),100,I')
Mostremos el Stock actual para el ID 1
SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A WHERE A.ID = 1
Insertemos otros registros
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')
Mostremos el Stock actual para el ID 1
SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A WHERE A.ID = 1

Eliminemos la transaccion (1) de cantidad = 100


DELETE FROM dbo.Movimientos WHERE TRANSACCION = 1
Eliminemos la transaccion (3) de cantidad = 5
DELETE FROM dbo.Movimientos WHERE TRANSACCION = 3
Mostremos el stock actual de la tabla Articulos
SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A
Eliminamos todos los movimientos realizados
DELETE FROM dbo.Movimientos
Deshabilitar 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')
Mostremos el stock actual de la tabla Articulos
SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A

El siguiente ejemplo, graba un histrico de saldos cada vez que se modifica un saldo de la tabla
cuentas.

CREATE TRIGGER TR_CUENTAS


ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instruccin
SET NOCOUNT ON;
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
END
La siguiente instruccin provocar que el trigger se ejecute:

UPDATE CUENTAS
SET SALDO = SALDO + 10
WHERE IDCUENTA = 1
Una consideracin a tener en cuenta es que el trigger se ejecutar aunque la instruccion DML
(UPDATE, INSERT o DELETE ) no haya afectado a ninguna fila. En este caso inserted y deleted
devolveran un conjunto de datos vacio.
Podemos especificar a que columnas de la tabla debe afectar el trigger.

ALTER TRIGGER TR_CUENTAS


ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instruccin
SET NOCOUNT ON;

IF UPDATE(SALDO) -- Solo si se actualiza SALDO


BEGIN
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
END
END
Los trigger estn dentro de la transaccin original (Insert, Delete o Update) por lo cual si dentro
de nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrs nuestro trigger
sino tambin toda la transaccin; en otras palabras si en un trigger ponemos un RollBack Tran, la
transaccin de Insert, Delete o Update volver toda hacia atrs.

ALTER TRIGGER TR_CUENTAS


ON CUENTAS
AFTER UPDATE
AS

BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instruccin
SET NOCOUNT ON;
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED

ROLLBACK
END
En este caso obtendremos el siguiente mensaje de error:
La transaccin termin en el desencadenador. Se anul el lote.

Das könnte Ihnen auch gefallen