Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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 ocasión 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 acción en la base de datos, esta acción 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, también 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 acción 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,
acción (guardara el nombre de la acción producida), fecha_accion (guarda la fecha y hora cuando se
produce la acción de insert).
0 comentarios:
P
Triggers en Transact SQL
Trigger DML, se ejecutan cuando un usuario intenta modificar datos mediante un evento de
lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o
DELETE de una tabla o vista.
Trigger DDL, se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de
datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP
de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan
operaciones de tipo DDL.
Trigger DML.
Los trigger DML se ejecutan cuando un usuario intenta modificar datos mediante un evento de
lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT,
UPDATE o DELETE de una tabla o vista.
AS
BEGIN
END
La primera tabla (inserted) solo está disponible en las operaciones INSERT y UPDATE y en
ella están los valores resultantes despues de la inserción o actualización. Es decir, los datos
insertados.Inserted estará vacia en una operación DELETE.
En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, están los valores
anteriores a la ejecución de la actualización o borrado. Es decir, los datos que
serán borrados. Deletedestará vacia en una operacion INSERT.
¿No existe una tabla UPDATED? No, hacer una actualización es lo mismo que borrar (deleted)
e insertar los nuevos (inserted). La sentencia UPDATE es la única en la
que inserted y deleted tienen datos simultaneamente.
El siguiente ejemplo, graba un historico de saldos cada vez que se modifica un saldo de la tabla
cuentas.
ON CUENTAS
AFTER UPDATE
AS
BEGIN
FROM INSERTED
END
La siguiente instrucción provocará que el trigger se ejecute:
UPDATE CUENTAS
WHERE IDCUENTA = 1
Una consideración 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 deleteddevolveran un conjunto de datos vacio.
ON CUENTAS
AFTER UPDATE
AS
BEGIN
BEGIN
FROM INSERTED
END
END
Los trigger están dentro de la transacción original (Insert, Delete o Update) por lo cual si dentro
de nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrás nuestro trigger
sino también toda la transacción; en otras palabras si en un trigger ponemos un RollBack Tran, la
transacción de Insert, Delete o Update volverá toda hacia atrás.
ON CUENTAS
AFTER UPDATE
AS
BEGIN
FROM INSERTED
ROLLBACK
END
GO
GO
GO
Trigger DDL
Los trigger DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición
de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y
DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan
operaciones de tipo DDL.
ON DATABASE
AS
BEGIN
...
END
La siguiente instrucción impide que se ejecuten sentencias DROP TABLE y ALTER TABLE
en la base de datos.
AS
BEGIN
ROLLBACK TRANSACTION
END
GO
GO
SET NOCOUNT ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Descripción: Ejemplo de funcionamiento de trigger
-- Author: Yovento
-- Fecha: 2010-06-16
-- =============================================
CREATE TRIGGER [dbo].[trgAS_InfoForos]
ON [dbo].[tblAfectar]
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
END
GO
GO
donde
trigger_name: Es el nombre del disparador. A nombre del disparador debe ajustarse a las reglas
de los identificadores y debe ser único dentro de la base de datos.
CIFRADO: Cifra las entradas syscomments que contienen el texto de la sentencia CREATE
TRIGGER.
Ejemplo 1:
Esta activación se utiliza para insertar y actualizar los valores en un campo de fecha y hora
cuando el usuario inserta datos en campo de fecha (VARCHAR) y el campo de hora
(varchar). Esta activación también se utiliza la función CONVERT para convertir el tipo de datos
varchar al tipo de datos de fecha y hora.
Ejemplo 2:
Este ejemplo es una adición a la anterior. En este disparador, no sólo actualizar el campo de
fecha y hora durante más de una columna, sino también comprobar para ver si la fecha es
nulo. Cuando es nula, se escribe un valor nulo en el campo de fecha y hora respectiva. Aquí se
utiliza el mismo tiempo .. bucle para pasar por cada registro
Observaciones:
Uno de los problemas que tuvimos con estos factores fue que iba a escribir 01 de enero 1900
12:00 AM en el campo de fecha y hora whenver hubo un NULL en campos de fecha y tiempo. El
problema se solucionó utilizando el método de lazo. Sin embargo, mi jefe, Dick no quería que el
disparador para recorrer cada registro individual. Así que decidió escribir el gatillo sin el bucle
Hemos intentado muchos enfoques diferentes para abordar el problema sin mucho
éxito. Inicialmente se utilizó si .. entonces las declaraciones, junto con la función de conversión a
escribir NULLS en lugar de 01 de enero 1900 12:00 AM. Este fue un éxito en los casos en que
entramos en un principio nulos. Si el usuario entra en el formato correcto para la fecha y la
hora, las columnas de fecha y hora volverá a 1 de enero 1900 12:00 AM. Una de las razones por
las que esto ocurre tiene que ver con el comandoUPDATE .. SET. Cuando se utiliza este comando
sin la cláusula WHERE, las actualizaciones de SQL Server todos los registros de la
columna. Puesto que no quería usar el lazo, no hemos podido encontrar una manera de utilizar
la cláusula WHERE con eficacia.Esto fue muy frustrante y no tenemos una solución para estos
problemas todavía.
Creación de Disparadores
1. Haga clic para expandir el nodo de la tabla a la que desea agregar el gatillo. El nodo
de disparadores aparece (ver Figura 14.3 ).
He aquí un ejemplo:
SI @ Descatalogado = 0
BEGIN
ROLLBACK TRAN
RAISERROR ('producto activo no puede ser eliminado',
16,1)
FIN
INSTEAD OF