Documente Academic
Documente Profesional
Documente Cultură
Un ejemplo de triggers para el control de Stock 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 DATEDEFAULT(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 Elkiminamos 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
Tabla tb_Productos_Audit_Insert, tiene los campos idProducto (clave primaria), nombre, precio, accin (guardara el nombre de la accin producida), fecha_accion (guarda la fecha y hora cuando se produce la accin de insert).
Luego creamos el Trigger: CREATE TRIGGER [dbo]. [tg_Productos_Audit_Insert] //NOMBRE DEL TRIGGER ON [dbo].[tb_Productos] //ELEGIMOS LA TABLA SOBRE LA CUAL SE REALIZARA FOR INSERT //ELEGIMOS LA ACCION AS DECLARE @now datetime //DECLARO UNA VARIABLE QUE GUARDE LA FECHA Y HORA DECLARE @accion nvarchar(10) //DECLARO UNA VARIABLE QUE TENDRA EL NOMBRE DE LA ACCION BEGIN TRY //PONEMOS LA EJECUCION DE LA CONSULTA SQL DENTRO DE UN TRY PARA QUE SI NO SE EJECUTA CORRECTAMENTE HACEMOS UN ROLLBACK DE LA TRANSACCION SET @now = getdate() //TOMO LA FECHA Y HORA SET @accion = 'INSERTED' //PONGO EL NOMBRE DE LA ACCION INSERT INTO [dbo].[tb_Productos_Audit_Insert] //TABLA PARA LA AUDITORIA DEL INSERT (idProducto, Nombre, Precio, Accion, Fecha_Accion) SELECT INSERTED.idProducto, INSERTED.Nombre, INSERTED.Precio, @accion, @now FROM INSERTED // TRAE LOS VALORES DE LA TABLA INSERTED, SI BORRAMOS LOS DATOS LA TABLA VIRTUAL QUE CONTENDRA LOS DATOS BORRADOS ES DELETED END TRY BEGIN CATCH ROLLBACK TRANSACTION //VUELVE ATRAS LOS CAMBIOS
RAISERROR (HUBO UN ERROR SOBRE LA INSERCION DE LA TABLA AUDITORA DE PRODUTOS,20,1) END CATCH GO HACEMOS ALGUNOS INSERT SOBRE LA TABLA PRODUCTOS. HACEMOS una consulta de SELECT sobre la tabla auditora: