desencadenadores UPDATE y DELETE

20/09/2008 - 19:59 por jcpc91 | Informe spam
hola grupo
tengo el siguiente problema que pense ke sería fácil resolver:
Lo que quiero hacer es que tras marcar modificar el campo vitrina a 1
en la tabla Bolsa los registros de la tabla Prendas relacionados con
el registro en la tabla bolsa se "muevan"(entre comillas) a otra tabla
Productos pero ese "movimiento" en realidad significa que las tengo
que eliminar de la tabla Prendas y luego insertarlos en la tabla
Productos.
Para lo anterior pensé ke sería buena idea tener dos desencadenadores
uno el la tabla Bolsa en el UPDATE y otra en la tabla Prendas en el
DELETE de tal forma que el UPDATE elimine los registros en la tabla
Prendas que desencadenará el desencadenante DELETE en la tabla Prendas
pero el problema que tengo es que cuando se dispara el desencadenante
DELETE en la tabla del trigger "deleted" están todos los registros que
se eliminaron y es ahí donde no sé como puedo iterar en cada registro
de la tabla "deleted" no quiero utilizar cursores porke no los sé
utilizar y ademas he leido que no son buenos porke consumen muchos
recursos y son más lentos (Bueno eso se dice "mito urbano")
este es mi primer desencadenador el UPDATE que elimina registros en la
tabla Prendas:

ALTER TRIGGER [dbo].[BolsaVitrina]
ON [dbo].[Bolsa]
after UPDATE
AS
BEGIN
IF UPDATE(vitrina)--aqui veo si se modifico el campo vitrina
begin
if (select inserted.vitrina from inserted) = 1 --aqui determino si
el campo vitrina cambio a su estado a 1
begin
relacionados entre la tabla bolsa y prendas (1 a muchos)
delete from Prenda where id_bolsa = (select id_bolsa from
inserted)-
end
end
END

este es mi segundo desencadenante que se dispara al eliminar los
registros en la tabla Prendas y los inserta en la tabla Productos ( y
porke bueno porke las Prendas se convertirán en Productos para la
compañía)

alter TRIGGER EliminarPrendas
ON Prenda
AFTER DELETE
AS
BEGIN

IF (SELECT COUNT(deleted.id) FROM deleted) > 0 --aki solo pregunto si
hay registros en la tabla deleted
begin

trigger se dispararía por cada registro
eliminados y eso está bien pero no sé como
otra forma se los agradesería que mo lo

declare @id_bolsa as int
declare @descgramos as int
declare @kilates as int
declare @gramos as int
declare @calidad nvarchar(10)
declare @detelles nvarchar(100)


select @id_bolsa = deleted.id_bolsa
,@descgramos = deleted.Desc_prenda
,@kilates = deleted.Ktes
,@gramos = deleted.Grms
,@calidad = deleted.Calidad
,@detelles = deleted.[Detalles de Prenda]
from deleted


INSERT INTO [db2].[dbo].[TblProductos]
([id_bolsa]
,[descuento_gramos]
,[kilates]
,[gramos]
,[calidad]
,[detalles])
VALUES
(@id_bolsa
,@descgramos
,@kilates
,@gramos
,@calidad
,@detelles)
end
END
GO

otra cosa no sé si existe el FOREACH
 

Leer las respuestas

#1 jcpc91
20/09/2008 - 20:08 | Informe spam
Otra cosa no sé si el FOREACH de sql server porke creo ke existe ya
que lo he estado leyendo en otros post me puede servir para lo
anterior explicado tal y como funciona en .net que te permite iterar
de manera fácil en un arreglo si no existe creo ke la gente de hizo
sql server debería de ponerse las pilas y hacer algo similar como
en .net algo así como

FOREACH ROW IN (select * from MiTabla)
BEGIN
INSERT INTO MiTabla2 (col1, col2) VALUES (ROW.COL1, ROW.COL2)
END

ke opinan no es más bonita esa sintaxis mas limpia y entendible y no
esos horribles cursores que son de redificiles de leer

gracias por sus respuestas

Preguntas similares