Hola amigos de foro:
Quiero hacer una consulta sobre triggers con relacion a que tan lento
pondrian estos mi aplicación
Me refiero si la tabla detalles seria de miles de registros y lo acumulara
en en la tabla de acumulaciones que presento a continuación, seria eficiente
esto y se podria usar en muchas tablas mi aplicacion esta hecha en visual
basic 6
Gracias.
Creación de triggers con Sql-Server
15 de Agosto de 2001
Todo lo que viene a continuación es código fuente con un ejemplo de como
usar las tablas inserted y deleted en triggers para que en insercciones
masivas
de datos no solamente tengamos acceso al primer elemento insertado o borrado
sino a todos, además evita el uso de cursores que enlentecen siempre el
proceso.
Observad que no borro las tablas temporales #insertados y #eliminados
ya que por definición su alcance es local al procedimiento (trigger en este
caso).
Bien, al código
Si quereis probarlo es suficiente con copiar y pegar a partir del create
table.
A disfrutar.
Create table detalles (id int identity(1,1) not null primary key,
Descripcion varchar(80) not null,
Codigo int ,
Cantidad int,
Precio money)
go -- y otra para guardar los acumulados .
create table acumulados (Codigo int not null, Cantidad int, Totalprecio
money)
go
create trigger trg_Detalles on detalles
for insert,update,delete -- Actuaré se haga lo que se haga desde este
trigger
as
insertando
registro.
select
Select Codigo,Sum(Cantidad) Cantidad,Sum(cantidad*Precio) precio
into #insertados
From inserted
group by codigo
update acumulados
set Acumulados.cantidad= Acumulados.cantidad +insertados.cantidad ,
Acumulados.TotalPrecio = Acumulados.TotalPrecio + insertados.precio
from #insertados insertados inner join acumulados on acumulados.codigo
=insertados.codigo
acumulados
insert into acumulados
select
inserted.Codigo,Sum(inserted.Cantidad),sum(inserted.precio*inserted.cantidad
)
from inserted left outer join Acumulados on inserted.codigo acumulados.codigo
where acumulados.codigo is null
group by inserted.codigo
go
insert into detalles values ('Primer elemento',1,1,1500)
go
select * from acumulados
go
insert into detalles values ('10 Unidades del primer elemento',1,10,1500)
go
select * from acumulados
existente,
es correcta
insert into detalles values ('10 Unidades del segundo elemento',2,10,1500)
go
insert into detalles select descripcion,codigo,cantidad,precio from detalles
go
select * from acumulados
go
alter trigger trg_Detalles on detalles
for insert,update,delete -- Actuaré se haga lo que se haga desde este
trigger
as
insertando
registro.
select
Select Codigo,Sum(Cantidad) Cantidad,Sum(cantidad*Precio) precio
into #insertados
From inserted
group by codigo
update acumulados
set Acumulados.cantidad= Acumulados.cantidad +insertados.cantidad ,
Acumulados.TotalPrecio = Acumulados.TotalPrecio + insertados.precio
from #insertados insertados inner join acumulados on acumulados.codigo
=insertados.codigo
acumulados
insert into acumulados
select
inserted.Codigo,Sum(inserted.Cantidad),sum(inserted.precio*inserted.cantidad
)
from inserted left outer join Acumulados on inserted.codigo acumulados.codigo
where acumulados.codigo is null
group by inserted.codigo
Select Codigo,Sum(Cantidad) Cantidad,Sum(cantidad*Precio) precio
into #Eliminados
From Deleted
group by codigo
update acumulados
set Acumulados.cantidad= Acumulados.cantidad - eliminados.cantidad ,
Acumulados.TotalPrecio = Acumulados.TotalPrecio - eliminados.precio
from #Eliminados eliminados inner join acumulados on acumulados.codigo eliminados.codigo
existiesen
¿Nó?
go
delete from detalles where id=1
go
select * from acumulados
go
delete from detalles
go
select * from acumulados
insert into detalles values ('10 Unidades del primer elemento',1,10,1500)
insert into detalles values ('Otras 10 Unidades del primer
elemento',1,10,1500)
insert into detalles values ('10 Unidades del segundo elemento',2,10,1500)
go
select * from acumulados
go
update detalles set cantidad=cantidad*2 where codigo=1
go
select * from acumulados
go
update detalles set cantidad=0
go
select * from acumulados
go
delete from detalles
go
select * from acumulados
go
Leer las respuestas