Modificacion en Cascada

13/01/2004 - 15:46 por Pablo Salazar | Informe spam
El dia de ayer coloque un post donde explicaba que me daba error al
modificar el campo producto ( llave primaria de la tabla Productos ), ya que
no me efectuaba la modificacion en cascada, agradezco los comentarios y
estoy consiente de que una llave primaria no se deberia cambiar ( como dijo
maxi ya hay documentos con ese codigo), pero en algun momento puede
darse(aunque no es correcto) y en mi caso se dio.
Solucione el problema de la siguiente forma : en una de las tablas que
estaba relacionada con la tabla producto, tenia un trigger que se activa con
"Update", le quite por un momento ese trigger y todo funciono.
Ahora me queda otra duda: por ejemplo si se tiene un trigger update en una
tabla y modificas un registro ese trigger se activa y todo trabaja de
maravilla pero si modificas en conjunto por medio de un update da error.
Alguien me puede decir porque sucede esto?

Por sus comentarios Gracias.

Pablo Salazar.

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
13/01/2004 - 15:57 | Informe spam
Pablo de nada!!

te da error porque has pensado el trigger para que trabaje con un solo
registro y no con un conjunto de registros.

Deberias o repensar el trigger o poner una condicion if @@rowcount = 1
para que si es un solo registro ejecute una cosa y si es mas de uno otra.

pero como consejo te digo q mires bien el trigger (o lo pases a la lista)
porque es muy probable que lo podamos rediseñar para que trabaje con mas de
un registro ;)

Salu2

Maximiliano Damian Accotto


"Pablo Salazar" escribió en el mensaje
news:%
El dia de ayer coloque un post donde explicaba que me daba error al
modificar el campo producto ( llave primaria de la tabla Productos ), ya


que
no me efectuaba la modificacion en cascada, agradezco los comentarios y
estoy consiente de que una llave primaria no se deberia cambiar ( como


dijo
maxi ya hay documentos con ese codigo), pero en algun momento puede
darse(aunque no es correcto) y en mi caso se dio.
Solucione el problema de la siguiente forma : en una de las tablas que
estaba relacionada con la tabla producto, tenia un trigger que se activa


con
"Update", le quite por un momento ese trigger y todo funciono.
Ahora me queda otra duda: por ejemplo si se tiene un trigger update en una
tabla y modificas un registro ese trigger se activa y todo trabaja de
maravilla pero si modificas en conjunto por medio de un update da error.
Alguien me puede decir porque sucede esto?

Por sus comentarios Gracias.

Pablo Salazar.


Respuesta Responder a este mensaje
#2 Miguel Egea
13/01/2004 - 16:11 | Informe spam
eso sucede por que tu trigger no procesa las tablas inserted y deleted como
un conjunto de registros sino como uno solo. Si revisas los triggers que hay
en portalsql.com puedes ver como se harían estas cosas.

Saludos
Miguel Egea
"Pablo Salazar" escribió en el mensaje
news:#
El dia de ayer coloque un post donde explicaba que me daba error al
modificar el campo producto ( llave primaria de la tabla Productos ), ya


que
no me efectuaba la modificacion en cascada, agradezco los comentarios y
estoy consiente de que una llave primaria no se deberia cambiar ( como


dijo
maxi ya hay documentos con ese codigo), pero en algun momento puede
darse(aunque no es correcto) y en mi caso se dio.
Solucione el problema de la siguiente forma : en una de las tablas que
estaba relacionada con la tabla producto, tenia un trigger que se activa


con
"Update", le quite por un momento ese trigger y todo funciono.
Ahora me queda otra duda: por ejemplo si se tiene un trigger update en una
tabla y modificas un registro ese trigger se activa y todo trabaja de
maravilla pero si modificas en conjunto por medio de un update da error.
Alguien me puede decir porque sucede esto?

Por sus comentarios Gracias.

Pablo Salazar.


Respuesta Responder a este mensaje
#3 Pablo Salazar
13/01/2004 - 17:08 | Informe spam
El triger que les mando se activa cuando se modifica un registro de la tabla
ttrans( esta tabla tiene un campo producto)
Cuando modifico un producto en la tabla Producto se produce la
actualizacion en cascada y modifica monton de registros en la tabla ttrans y
se activa este trigger.


CREATE Trigger tTransDetalle_Modificar
On dbo.tTransDetalle
/*No permite modificar tTransDetalle si Fecha es anterior a
tParámetros.HorasModificar
y no tiene permiso para modificar (tPermisos.Modificar)*/
For Insert, Update, Delete
As

DECLARE @U varchar(100)
DECLARE @IDTrans bigint
SELECT @U=SUBSTRING(system_user,CHARINDEX('\',system_user)+1,99)
IF EXISTS( SELECT * FROM Inserted)
SELECT @IDTrans=IDTrans FROM Inserted
ELSE
SELECT @IDTrans=IDTrans FROM Deleted

IF EXISTS(
SELECT modificar FROM tPermisos
WHERE Usuario=@U and modificar=0)
IF EXISTS(
SELECT tTrans.Fecha,
datediff(hh,tTrans.Fecha,getdate()),
getdate()-tTrans.Fecha as F
FROM tTrans, tParámetros
WHERE tTrans.IDTrans=@IDTrans
AND datediff(hh,tTrans.Fecha,getdate())>tParámetros.HorasModificar
)
BEGIN
ROLLBACK TRAN
RAISERROR 50000 'No es posible modificar!'
END





Gracias.
Respuesta Responder a este mensaje
#4 Miguel Egea
13/01/2004 - 17:24 | Informe spam
cambia esto
WHERE tTrans.IDTrans=@IDTrans

por
where ttrans.idtrans in (select idtrans from inserted)

y quita esto
IF EXISTS( SELECT * FROM Inserted)
SELECT @IDTrans=IDTrans FROM Inserted
ELSE
SELECT @IDTrans=IDTrans FROM Deleted


Así sin probar creo que resolverá tu problema.


"Pablo Salazar" escribió en el mensaje
news:OR5lR#
El triger que les mando se activa cuando se modifica un registro de la


tabla
ttrans( esta tabla tiene un campo producto)
Cuando modifico un producto en la tabla Producto se produce la
actualizacion en cascada y modifica monton de registros en la tabla ttrans


y
se activa este trigger.


CREATE Trigger tTransDetalle_Modificar
On dbo.tTransDetalle
/*No permite modificar tTransDetalle si Fecha es anterior a
tParámetros.HorasModificar
y no tiene permiso para modificar (tPermisos.Modificar)*/
For Insert, Update, Delete
As

DECLARE @U varchar(100)
DECLARE @IDTrans bigint
SELECT @U=SUBSTRING(system_user,CHARINDEX('\',system_user)+1,99)
IF EXISTS( SELECT * FROM Inserted)
SELECT @IDTrans=IDTrans FROM Inserted
ELSE
SELECT @IDTrans=IDTrans FROM Deleted

IF EXISTS(
SELECT modificar FROM tPermisos
WHERE Usuario=@U and modificar=0)
IF EXISTS(
SELECT tTrans.Fecha,
datediff(hh,tTrans.Fecha,getdate()),
getdate()-tTrans.Fecha as F
FROM tTrans, tParámetros
WHERE tTrans.IDTrans=@IDTrans
AND datediff(hh,tTrans.Fecha,getdate())>tParámetros.HorasModificar
)
BEGIN
ROLLBACK TRAN
RAISERROR 50000 'No es posible modificar!'
END





Gracias.


Respuesta Responder a este mensaje
#5 Maximiliano D. A.
13/01/2004 - 17:26 | Informe spam
Estimado:

el tema es que no estas usando la tabla inserted en tu select

IF EXISTS(
SELECT modificar FROM tPermisos
WHERE Usuario=@U and modificar=0)
IF EXISTS(
SELECT tTrans.Fecha,
datediff(hh,tTrans.Fecha,getdate()),
getdate()-tTrans.Fecha as F
FROM tTrans, tParámetros
WHERE tTrans.IDTrans=inserted.idtrans
AND datediff(hh,tTrans.Fecha,getdate())>tParámetros.HorasModificar
)


las variables solo podran tener un solo valor, o sea si hay mas de uno
traera el ultimo y es por ello que te falla.

Revisa lo que te indico tambien Miguel en su web que hay un claro ejemplo de
como hacer estas cosas

Salu2
Maximiliano Damian Accotto


"Pablo Salazar" escribió en el mensaje
news:OR5lR%
El triger que les mando se activa cuando se modifica un registro de la


tabla
ttrans( esta tabla tiene un campo producto)
Cuando modifico un producto en la tabla Producto se produce la
actualizacion en cascada y modifica monton de registros en la tabla ttrans


y
se activa este trigger.


CREATE Trigger tTransDetalle_Modificar
On dbo.tTransDetalle
/*No permite modificar tTransDetalle si Fecha es anterior a
tParámetros.HorasModificar
y no tiene permiso para modificar (tPermisos.Modificar)*/
For Insert, Update, Delete
As

DECLARE @U varchar(100)
DECLARE @IDTrans bigint
SELECT @U=SUBSTRING(system_user,CHARINDEX('\',system_user)+1,99)
IF EXISTS( SELECT * FROM Inserted)
SELECT @IDTrans=IDTrans FROM Inserted
ELSE
SELECT @IDTrans=IDTrans FROM Deleted

IF EXISTS(
SELECT modificar FROM tPermisos
WHERE Usuario=@U and modificar=0)
IF EXISTS(
SELECT tTrans.Fecha,
datediff(hh,tTrans.Fecha,getdate()),
getdate()-tTrans.Fecha as F
FROM tTrans, tParámetros
WHERE tTrans.IDTrans=@IDTrans
AND datediff(hh,tTrans.Fecha,getdate())>tParámetros.HorasModificar
)
BEGIN
ROLLBACK TRAN
RAISERROR 50000 'No es posible modificar!'
END





Gracias.


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida