Sunteți pe pagina 1din 7

Ejemplo de triggers Sql Server 2008

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

Trigger en Transact SQL (SQL Server 2008) Ejemplo de Insert (DML)


Publicado por Cristian Ayala en 16:42 Etiquetas: SQL Server
En esta ocasin voy a publicar como crear un Trigger desde cero, para que tengan un pantallazo en general un Trigger es como su nombre lo dice un desencadenador, el cual ejecuta una serie de operaciones Transact SQL al producirse una accin en la base de datos, esta accin puede ser cambios a nivel datos (DML Data Manipulation Language) y a nivel esquema (DDL Data Definition Language), los cambios a nivel de datos se refieren a INSERT/DELETE/UPDATE que se puedan producir en los datos de la base de datos. Los Triggers se usan generalmente para hacer auditorias sobre las tablas, y para tener un mejor control de las mismas, ya que si los datos son borrados los mismos se pueden recuperar, tambin se pueden usar para guardar datos de algo en especifico como las compras de un proveedor. Empezamos con el ejemplo de DML para cuando se produzca una accin de Insert sobre una determinada tabla. Las tablas que guardan estas acciones son dos INSERTED (inserciones) y DELETED (borrados). Para ello creamos una tabla producto y otra tabla que contendr todos los productos insertados. Tabla Productos, tb_Productos, tiene los campos idProducto (llave primaria, identidad), nombre, precio.

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).

Cargo datos en la tabla Productos.

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:

Los Triggers se guardan sobre la tabla en donde se utilizara:

S-ar putea să vă placă și