Escolar Documentos
Profissional Documentos
Cultura Documentos
De igual manera sucede cuando eliminamos registros, creando una tabla temporal
llamada DELETED, que cuando finalizamos la eliminación, pues dicha tabla temporal es
eliminada también automáticamente.
TABLA TEMPORAL UNA VEZ ELIMINADOS LOS REGISTROS SE ELIMINA AUTOMATICAMENTE
Por otra parte, cuando realizamos un UPDATE, pues se crean dos tablas temporales,
DELETED e INSERTED. Ya que un UPDATE, utiliza la tabla temporal DELETED, para
eliminar un registro que posteriormente, con la tabla INSERTED, lo sustituirá por uno
actualizado.
SE CREAN 2 TABLAS TEMPORALES
1
Y LA TABLA TEMPORAL INSERTED LO SUSTITUIRA POR UNO ACTUALIZADO SE ELIMINAN AUTOMATICAMENTE
Cabe mencionar que estas tablas temporales, se crean a partir de la misma estructura, de
las tablas con las cuales estemos trabajando. ¿Por qué resalto estos puntos? Pues… por
el simple hecho que los triggers aprovechan estas situaciones para ejecutarse.
¿QUÉ ES UN TRIGGER?
Es un procedimiento almacenado el cual se dispara cuando intentamos modificar una tabla
o una vista, a diferencia de los procedimientos almacenados, los triggers no se pueden
ejecutar de forma directa. Sino que obedecen a acciones que se realizan en una tabla en
particular en donde se hayan establecido, dependiendo de la acción que los desencadene.
Que puede ser un INSERT, un DELETE o un UPDATE.
2
EJEMPLO:
Vamos a crear la Base de datos Inventario y dentro de ella vamos a crear las siguientes
tablas: Productos, Historial y Ventas. Con las cuales vamos a realizar diferentes
ejemplos.
create database inventario;
GO
use inventario;
GO
Realicemos una consulta de las Tablas historial y productos para verificar que no tienen
registros almacenados en ellas.
3
El primer Trigger que vamos a crear se dispara cuando insertemos registros en la Tabla
productos, guardando en la tabla historial el detalle de la acción.
Nota: Este Trigger se dispara por inserción en la tabla productos, bajo el contexto que se
declara en la cláusula AS para su ejecución.
create trigger TR_ProductoInsertado
on productos for insert
as
insert into historial values(getdate(), 'registro insertado',
system_user)
go
4
Vamos a insertar el primer registro y note que aparecen dos filas afectadas, en donde
la primera corresponde a la inserción del nuevo registro y la segunda es el resultado
de la ejecución del Trigger. Lo cual envió a la Tabla historial un registro de la acción
realizada.
5
OBSERVACIONES:
Si se quieren agregar más datos al historial, como el nombre del producto o el código del
producto, pues hay que modificar tanto el Trigger como la estructura de la tabla, es decir la
tabla historial.
-- ELIMINA PRIMERO LA TABLA HISTORIAL--
drop table historial
-- INSERTAMOS UN REGISTRO
insert into productos values('A001','MEMORIA USB 32GB',175);
historial
productos
6
Ahora bien, sucede algo que debemos de evitar durante la ejecución del
Trigger, y es el hecho de que alguien puede percatarse de que hay un
Trigger detrás de todo el proceso.
Hay que modificar el Trigger de tal forma que solo aparezca la fila afectada
correspondiente a la inserción de los datos, para ello vamos a colocar lo
siguiente al Trigger.
7
El segundo Trigger que vamos a crear, que nos registre las acciones de eliminación en
la tabla.
8
Ahora bien, vamos a eliminar un registro para verificar la ejecución del Trigger de
TR_ProductoEliminado.
Realicemos una consulta de ambas tablas para verificar los movimientos generados.
9
El tercer Trigger que vamos a crear, que nos registre las acciones de actualización en la
tabla.
Ahora bien, vamos a actualizar un registro para verificar la ejecución del Trigger de
TR_ProductoActualilzado.
historial
productos
10
Vamos a crear un Trigger por medio del cual disminuiremos las existencias de un
determinado producto, cuando insertemos un registro en la tabla ventas o para que se
comprenda mejor, cuando realicemos una operación de venta.
ventas
productos
11
Realicemos la venta del producto A002.
ventas
productos
12
Con este procedimiento almacenado podemos verificar si una tabla contiene o no un
Trigger almacenado y a su vez podemos verificar cual es el Tipo de Trigger que
contiene.
sp_helptrigger ventas
go
sp_helptrigger productos
go
13
OBSERVACIONES:
1. Tipo after: Son aquellos que se disparan después de una acción, como puede ser
un UPDATE, un DELETE o un INSERT. Como habrán notado en cada uno de los
Triggers se utilizó la cláusula FOR, pudiendo haber utilizado la cláusula AFTER, sin
embargo, cuando utilizamos FOR por defecto se comprende que el Trigger que
estamos definiendo es de tipo AFTER.
2. Tipo instead of: Este tipo de Trigger se dispara antes de que ocurra un cambio en
las tablas, como puede ser un INSERT, un UPDATE o un DELETE, brindándonos
alternativas de acción según el criterio que nosotros establezcamos, por lo que
cuando se dispara cancela el resto de las acciones, ejecutando únicamente la que
cumpla el criterio definido, cabe destacar que cuando las tablas contengan llaves
foráneas que indiquen una acción de eliminación en cascada y actualización en
cascada, pues no se pueden crear Triggers instead of delete o instead of update.
14
Por otra parte, los disparadores de tipo after como los ejemplos anteriores, no se pueden
definir sobre vistas creadas.
EJEMPLO:
En primer lugar, vamos a crear 3 Tablas y noten que las tres tablas tienen la misma
estructura y el objetivo de este ejemplo es enviar productos a una tienda en particular, por
lo que el Trigger que vamos a definir tendrá que ejecutar una de tres acciones establecidas,
según el destino que nosotros asignemos y de esa forma cancelara las otras acciones al
no cumplir el criterio especificado, que en este caso sería el destino de la tienda hacia donde
se enviaran los productos.
use inventario
go
create table tienda1
(n_envio int,
cod_prod varchar(4),
nombre varchar(100),
Cantidad int)
go
15
REALICEMOS UNA CONSULTA DE LAS 3 TABLAS CREADAS.
tienda1
tienda2
tienda3
CONSULTEMOS LA VISTA.
16
AQUÍ SE ESTA OBSERVANDO LA COMBINACION DE LAS 3 TABLAS. LA
COMBINACION QUE HEMOS REALIZADO A DICHAS TABLAS, LA HE DEFINIDO
MEDIANTE union all, ASI DE ESTA FORMA PODRE ENVIAR LOTES DE
PRODUCTOS A UNA TIENDA EN PARTICULAR, POR LO QUE PODRE COLOCAR EL
NUMERO DE ENVIO REPEDITO EN DICHO LOTE DE PRODUCTOS A ENVIAR Y ESTO
ME LO PERMITIRA LA PALABRA CLAVE all, YA QUE, SI LA OMITIMOS, SOLO
PODRIAMOS ENVIAR UN PRODUCTO POR CADA NUMERO DE ENVIO, IMPIDIENDO
QUE SE REPITA. VEAN QUE A LA VISTA LE HE AGREGADO UNA COLUMNA EXTRA
COMO DESTINO, EN DONDE ESTABLECEMOS EL NOMBRE DE CADA UNA DE LAS
TIENDAS, PARA QUE EL TRIGGER QUE DEFINIMOS PUEDA IDENTIICAR CADA
DESTINO Y ASI INSERTAR LOS ENVIOS DONDE CORRESPONDA.
CREAREMOS EL TRIGGER:
17
INSERTEMOS EL SIGUIENTE LOTE DE PRODUCTOS EN UN SOLO NUMERO DE
ENVIOS.
insert into tiendas values(2, '1002', 'Monitor LED 17 pulgadas', 35, 'tienda3')
insert into tiendas values(2, '1003', 'CABLE HDMI', 50, 'tienda3')
insert into tiendas values(2, '1004', 'AIRE COMPRIMIDO', 45, 'tienda3')
insert into tiendas values(2, '1005', 'PASTA TERMICA', 23, 'tienda3')
go
tienda1
tienda2
tienda3
18
CONSULTEMOS POR ULTIMO LA VISTA:
19