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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Rafael Cano
20/09/2008 - 20:20 | Informe spam
Por favor escribe en español, esto no es un móvil, hay gente estrangera
que lee el foro.

escribió:
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



Respuesta Responder a este mensaje
#3 Ricardo Passians
21/09/2008 - 15:36 | Informe spam
Primero, en el trigger para Update de la tabla Bolsa debes considerar que
ambas Inserted y Deleted pueden tener varios registros y no uno solo, y por
tanto hacer un inner join con la tabla Inserted

Algo así por ejemplo.:

if Update(vitrina)
delete Prenda from Inserted Inner Join Prenda on
Inserted.id_bolsa=Prenda.id_bolsa
where Inserted.Vitrina=1

Puedes ver mas detalles del uso de Delete con un Join en los libros en
línea.

Nota: El [if Update()] te da true si la columna se usó en el update pero eso
no necesariamente indica que el valor ha cambiado realmente. Para esto
podrias comparar los valores del campo vitrina de las dos tablas Inserted y
Deleted a ver si realmente ha cambiado para los registros correspondientes.

Quizas así (si es necesario):

if Update(vitrina)
delete Prenda from Inserted
Inner Join Deleted on Inserted.id_bolsa=Deleted.id_bolsa
Inner Join Prenda on Inserted.id_bolsa=Prenda.id_bolsa
where Deleted.Vitrina<>0 and Inserted.Vitrina=1

Claro que la definición supone que la id_bolsa es la clave primaria y no va
a cambiar en un update.

-
Segundo, en el trigger para Delete de la otra tabla, puedes simplemente
hacer un insert y en la misma agregarle un select para sacar los registros
desde la tabla Deleted.

Ejemplo (es una sola instrucción):.

INSERT INTO TblProductos (id_bolsa ,descuento_gramos ,kilates ,gramos
,calidad ,detalles)
select id_bolsa, Desc_prenda, Ktes, Grms,Calidad, [Detalles de Prenda]
from deleted

Pero debes estar seguro si cada vez que se borre algo en Prendas (aunque no
sea a traves del otro trigger) deba dispararse igual este trigger para
Delete. Si no, poner alguna condición.


Nota al margen:
Siempre es bueno usar los mismos nombres de campos que se usen para lo mismo
en distintas tablas, ejemplo: kilates y Ktes, gramos y Grms, etc. deberían
llamarse igual. Eso te ahorra trabajo.


Espero te sirva,

Ricardo Passians
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida