Professional Documents
Culture Documents
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
El siguiente ejemplo, graba un histrico de saldos cada vez que se modifica un saldo de la tabla
cuentas.
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.
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.