Documentos de Académico
Documentos de Profesional
Documentos de Cultura
<dml_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
<method_specifier> ::=
assembly_name.class_name.method_name
Primeramente definiremos las tablas a utilizar en este ejemplo ver diagrama ER.
Definiremos un trigger de inserción, en la tabla productos, porque, debido a que siempre que se crea un
producto es necesario crear el código en la tabla de Existencias.
create trigger ins_productos on Productos
for insert
as
NERM Pagina 2 de 11
UTEC C01/2019 BAS2
begin
declare @vcodi_prod int
select @vcodi_prod=codi_prod from inserted
insert Existencias (codi_prod, unid_prod) values (@vcodi_prod, 0.0)
end
Ahora probaremos el trigger, ello se lograra, insertando un producto, por ello insertamos los datos de un
tornillo de 1 pulgada para madera, esto estaría en la categoría 2, esto lo conocemos ejecutando:
select * from Categorias
Para verificar que se ha realizado la inserción del producto y el funcionamiento del trigger, ejecutamos lo
siguiente:
select * from Productos;
select * from Existencias;
NERM Pagina 3 de 11
UTEC C01/2019 BAS2
Definir trigger de tipo insercion (insert), en la tabla Detalle Compra que permitirá actualizar, la existencia del
artículo, incrementando el número de unidades en la medida que agreguemos una compra de dicho Producto
y a la vez que actualice el total en valor de la compra en la tabla Encabezado Compra.
create trigger ins_DetallaCompra on [Detalle Compra]
for insert
as
begin
declare @vcodi_prod int,
@vnume_fact int,
@vnume_unid numeric(38,10),
@vprec_unit money,
@vprec_tota money
--Obtenemos los datos del nuevo registro y lo asignamos a variables
select @vcodi_prod=codi_prod,@vnume_unid=nume_unid,@vprec_unit=prec_unit
from inserted
--Establecemos el total precio del producto al realizar una multiplicacion
--del numero de articulos por precio unitario.
select @vprec_tota=@vprec_unit * @vnume_unid
--Actualizamos la existencia, al incrementarla.
update Existencias
set unid_prod=unid_prod + @vnume_unid
where codi_prod=@vcodi_prod
--Actualizamos el total de la compra en encabezado de la compra.
NERM Pagina 4 de 11
UTEC C01/2019 BAS2
update [Encabezado Compra]
set tota_comp=tota_comp + @vprec_tota
end
Ahora insertamos un nuevo registro en el detalle de la compra, para nuestro caso el producto con Id = 4 que
es Llave 1/4 plg., y un precio unitario 7.5 para 5 unidades, que representaría un total de 37.50, este total seria
el valor del encabezado de compra.
insert [Detalle Compra] (codi_prod,nume_fact,nume_unid,prec_unit) values (4,1,5,7.5);
Ahora revisamos, que nuestro trigger haya realizado la actualización en la tablas Encabezado Compra y
Existencias.
NERM Pagina 5 de 11
UTEC C01/2019 BAS2
Figura 6: Consulta del registro insertado y que afecto las tablas relacionadas con el triggers.
Muy importante observar entre la figura 5 y 6 la columna de nombre tota_comp, que el valor se incrementó
con el nuevo registro agregado en el detalle de compra.
Ahora creamos un trigger para actualizar los datos (update), consideremos el hecho que se modificó el número
de unidades para el registro con Id_deta = 1, ya no son 5 sino que 8, esto siginifica que debemos incrementar
el número de unidades de existencia en tres y el precio total de la compra (tota_comp) por los tres productos
adicionales, un hecho importante a tener en cuenta que la modificación de un registro en la tabla Detalle
Compra, ocurrirá siempre porque actualizamos el registro, por ello debemos validar y enfocar que se modifica
o actualiza para que el trigger funcione adecuadamente, a continuación detallamos la estructura del trigger:
create trigger upd_DetalleCompra on [Detalle Compra]
for update
as
begin
declare @vcodi_prod int,
@vnume_fact int,
@vnume_unid_new numeric(38,10),
@vprec_unit_new money,
@vnume_unid_old numeric(38,10),
@vprec_unit_old money,
@vprec_tota money,
@vnume_unid numeric(38,10)
--Para este caso considerando que la actualizacion la realizamos por
--cantidad de producto significa que el codigo de producto y numero de factura
--es la misma por ello este dato no cambia
select @vcodi_prod=codi_prod, @vnume_fact=nume_fact from inserted
--Obtenemos los datos nuevos que ingresamos
select @vnume_unid_new=nume_unid, @vprec_unit_new=prec_unit from inserted
--Obtenemos los datos anteriores que se reemplazan
select @vnume_unid_old=nume_unid, @vprec_unit_old=prec_unit from deleted
--Obtenemos el valor total de factura
select @vprec_tota=tota_comp from [Encabezado Compra] where nume_fact=@vnume_fact
if update(nume_unid)
begin
--Calculando el valor total de factura y actualizando
set @vnume_unid=@vnume_unid_new - @vnume_unid_old
set @vprec_tota=@vprec_tota + (@vnume_unid * @vprec_unit_old)
update [Encabezado Compra] set tota_comp=@vprec_tota where nume_fact=@vnume_fact
--Actualizamos el numero de unidades de existencia
update [Existencias] set unid_prod=unid_prod + @vnume_unid where codi_prod=@vcodi_prod
NERM Pagina 6 de 11
UTEC C01/2019 BAS2
end
end
Observe que se incrementó el precio y número de unidades en tres porque anteriormente (ver Fig. 6) teníamos
5 unidades y en valor de la factura 48.50, el trigger funciona pero que sucede si cambian el precio unitario ya
no es 7.50 sino que 6.75, por ello modificaremos el trigger y ahora validamos cuando cambie el valor la columna
prec_unit, antes de realizar este cambio, modificar y actualizar el trigger.
alter trigger upd_DetalleCompra on [Detalle Compra]
for update
as
begin
declare @vcodi_prod int,
@vnume_fact int,
@vnume_unid_new numeric(38,10),
@vprec_unit_new money,
@vnume_unid_old numeric(38,10),
@vprec_unit_old money,
@vprec_tota money,
@vprec_tota_ori money,
@vnume_unid numeric(38,10)
--Para este caso considerando que la actualizacion la realizamos por cantidad de producto
--significa que el codigo de producto y numero de factura es la misma por ello este dato no
--cambia
select @vcodi_prod=codi_prod, @vnume_fact=nume_fact from inserted
--Obtenemos los datos nuevos que ingresamos
select @vnume_unid_new=nume_unid, @vprec_unit_new=prec_unit from inserted
--Obtenemos los datos anteriores que se reemplazan
select @vnume_unid_old=nume_unid, @vprec_unit_old=prec_unit from deleted
--Obtenemos el valor total de factura
select @vprec_tota_ori=tota_comp from [Encabezado Compra] where nume_fact=@vnume_fact
if update(nume_unid)
begin
set @vprec_tota=@vprec_tota_ori
--Calculando el valor total de factura y actualizando
NERM Pagina 7 de 11
UTEC C01/2019 BAS2
set @vnume_unid=@vnume_unid_new - @vnume_unid_old
set @vprec_tota=@vprec_tota + (@vnume_unid * @vprec_unit_old)
update [Encabezado Compra] set tota_comp=@vprec_tota where nume_fact=@vnume_fact
--Actualizamos el numero de unidades de existencia
update [Existencias] set unid_prod=unid_prod + @vnume_unid where codi_prod=@vcodi_prod
end
if update(prec_unit)
begin
set @vprec_tota=@vprec_tota_ori
--Calculamos el precio total con nuevo precio
set @vprec_tota=@vprec_tota - (@vnume_unid_old * @vprec_unit_old)
set @vprec_tota=@vprec_tota + (@vnume_unid_new * @vprec_unit_new)
--Actualizamos el monto total de la factura
update [Encabezado Compra] set tota_comp=@vprec_tota where nume_fact=@vnume_fact
end
end
NERM Pagina 8 de 11
UTEC C01/2019 BAS2
Ya tenemos el trigger de inserción para cuando registramos un ítem en el Detalla Compra asi como
controlado la actualizacion de uno existente, pero que sucede si borramos un ítem, este debe actualizar tanto
la existencia como el total del Encabezado Compra, para la compra numero 2 agregaremos un nuevo ítem
para el producto con código 7 y después lo eliminaremos.
insert [Detalle Compra] (codi_prod,nume_fact,nume_unid,prec_unit) values (7,2,25,22.73);
NERM Pagina 9 de 11
UTEC C01/2019 BAS2
NERM Pagina 10 de 11
UTEC C01/2019 BAS2
Figura 12: Efectivamente registro borrado y actualizado tanto existencia y valor de Encabezado.
Bibliografia
https://msdn.microsoft.com/en-us/library/ms189799(v=sql.110).aspx
https://msdn.microsoft.com/es-es/library/ms178110.aspx
https://msdn.microsoft.com/es-es/library/ms189799.aspx
i
Definicion tomada de https://msdn.microsoft.com/es-es/library/ms189799.aspx
NERM Pagina 11 de 11