Problemas de trigger al actualizar multiples tablas.

12/08/2004 - 23:43 por Mario Reiley | Informe spam
Hola Grupo,

Para resumir , tengo una tabla con (Actividades) y sus progresos (Avances)
con una clave primaria producto (Odt,CodigoProducto,Disciplina) ->
Progreso(Odt,CodigoProducto,Disciplina) como clave foranea.

De esta misma forma existe la misma relacion con otras tablas.

El asunto es que existe la posibilidad de actualizar alguna fila de la
tabla Producto (Incluyendo la clave Primaria) en algun momento en el tiempo.
y eso lo he querido hacer con un trigger y me genera un error (Error de
claves foraneas Producto -> Progreso).

Agradeceria cualquier ayuda.

Gracias

Este es mi Trigger:

ALTER TRIGGER triggerUpdateCodProducto
ON dbo.Producto
FOR UPDATE
AS
IF UPDATE (codProducto)
begin
update Producto
set CodProducto = inserted.CodProducto
from Producto, deleted, inserted
where deleted.odtId = Producto.odtId and
deleted.codProducto = Producto.codProducto and
deleted.disciplinaId <> Producto.disciplinaId
update Producto
set tipo = substring(inserted.CodProducto, 9, 1)
from Producto, inserted
where inserted.odtId = Producto.odtId and
inserted.codProducto = Producto.codProducto
update htDetalleNormal
set CodProducto = inserted.CodProducto
from htDetalleNormal, deleted, inserted
where deleted.odtId = htDetalleNormal.odtId and
deleted.CodProducto = htDetalleNormal.CodProducto
update htDetalleSt
set CodProducto = inserted.CodProducto
from htDetalleSt, deleted, inserted
where deleted.odtId = htDetalleSt.odtId and
deleted.codProducto = htDetalleSt.codProducto
update Progreso
set CodProducto = inserted.CodProducto
from Progreso, deleted, inserted
where deleted.odtId = Progreso.odtId and
deleted.CodProducto = Progreso.CodProducto and
deleted.DisciplinaId = Progreso.DisciplinaId
update ctrlImpProductoTecser
set productoId = inserted.codProducto
from ctrlImpProductoTecser, deleted, inserted
where deleted.odtId = ctrlImpProductoTecser.odtId and
deleted.CodProducto = ctrlImpProductoTecser.productoId and
deleted.DisciplinaId = ctrlImpProductoTecser.disciplina
update ctrlImpPotencialesImpresiones
set nombreArchivo = convert(char(4), inserted.odtId) + '-' +
inserted.codProducto
from ctrlImpProductoTecser, deleted, inserted
where deleted.odtId = ctrlImpPotencialesImpresiones.odtId and
ctrlImpPotencialesImpresiones.nombreArchivo = convert(char(4),
deleted.odtId) + '-' + deleted.codProducto
end
 

Leer las respuestas

#1 MAXI
13/08/2004 - 01:48 | Informe spam
Hola, y has pensado en usar Update en cascada dentro de la misma clave
foranea?

Lo que yo hago en estos casos es tener un Store que arme todo esto

Pasos:

1) Generar en la tabla cabecera el update de clave primaria como insertando
un nuevo registro
2) Haciendo el reemplazo en tablas hijas de nuevo valor
3) Eliminando de tabla madre valor

Se entiende?




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar
Msn Messager:

"Mario Reiley" escribió en el mensaje
news:
Hola Grupo,

Para resumir , tengo una tabla con (Actividades) y sus progresos (Avances)
con una clave primaria producto (Odt,CodigoProducto,Disciplina) ->
Progreso(Odt,CodigoProducto,Disciplina) como clave foranea.

De esta misma forma existe la misma relacion con otras tablas.

El asunto es que existe la posibilidad de actualizar alguna fila de la
tabla Producto (Incluyendo la clave Primaria) en algun momento en el


tiempo.
y eso lo he querido hacer con un trigger y me genera un error (Error de
claves foraneas Producto -> Progreso).

Agradeceria cualquier ayuda.

Gracias

Este es mi Trigger:

ALTER TRIGGER triggerUpdateCodProducto
ON dbo.Producto
FOR UPDATE
AS
IF UPDATE (codProducto)
begin
update Producto
set CodProducto = inserted.CodProducto
from Producto, deleted, inserted
where deleted.odtId = Producto.odtId and
deleted.codProducto = Producto.codProducto and
deleted.disciplinaId <> Producto.disciplinaId
update Producto
set tipo = substring(inserted.CodProducto, 9, 1)
from Producto, inserted
where inserted.odtId = Producto.odtId and
inserted.codProducto = Producto.codProducto
update htDetalleNormal
set CodProducto = inserted.CodProducto
from htDetalleNormal, deleted, inserted
where deleted.odtId = htDetalleNormal.odtId and
deleted.CodProducto = htDetalleNormal.CodProducto
update htDetalleSt
set CodProducto = inserted.CodProducto
from htDetalleSt, deleted, inserted
where deleted.odtId = htDetalleSt.odtId and
deleted.codProducto = htDetalleSt.codProducto
update Progreso
set CodProducto = inserted.CodProducto
from Progreso, deleted, inserted
where deleted.odtId = Progreso.odtId and
deleted.CodProducto = Progreso.CodProducto and
deleted.DisciplinaId = Progreso.DisciplinaId
update ctrlImpProductoTecser
set productoId = inserted.codProducto
from ctrlImpProductoTecser, deleted, inserted
where deleted.odtId = ctrlImpProductoTecser.odtId and
deleted.CodProducto = ctrlImpProductoTecser.productoId and
deleted.DisciplinaId = ctrlImpProductoTecser.disciplina
update ctrlImpPotencialesImpresiones
set nombreArchivo = convert(char(4), inserted.odtId) + '-' +
inserted.codProducto
from ctrlImpProductoTecser, deleted, inserted
where deleted.odtId = ctrlImpPotencialesImpresiones.odtId and
ctrlImpPotencialesImpresiones.nombreArchivo = convert(char(4),
deleted.odtId) + '-' + deleted.codProducto
end


Preguntas similares