SQL - Updates en cascada

 
Vista:

Updates en cascada

Publicado por Fermín (3 intervenciones) el 27/02/2001 17:05:22
Buenas.
Mi problema es el siguiente:
Tengo la siguiente jerarquía:
Tabla1 con clave C1
Tabla2 con clave C1 C2
Tabla3 con clave C1 C2 C3
y sus relaciones cabecera, detalle:
Tabla1.C1 -> Tabla2.C1
Tabla2.C1 C2 -> Tabla3.C1 C2

Me gustaría saber cómo realizar actualizaciones en cascada para poder cambiar C1 en Tabla1 y se cambie en Tabla2 y Tabla3 sin que me de error de constraint.

Gracias a todos lo que habéis leido el planteamiento.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Updates en cascada

Publicado por Angel (20 intervenciones) el 27/02/2001 19:42:54
En SqlServer para hacer esto debes deshabilitar temporalmente las "Foreign Key", realizar las actualizaciones en todas las tablas (no se pueden actualizar en cascada) y luego volver a habilitar las restricciones.
Seria un script parecido al siguiente:

ALTER TABLE T3 NOCHECK CONSTRAINT FK_T2_T3
go
ALTER TABLE T2 NOCHECK CONSTRAINT FK_T1_T2
go
UPDATE T1 SET C1 = VAL1
GO
UPDATE T2 SET C1 = VAL1
GO
UPDATE T3 SET C1 = VAL1
GO
ALTER TABLE T2 CHECK CONSTRAINT FK_T1_T2
go
ALTER TABLE T3 CHECK CONSTRAINT FK_T2_T3
go

Sobre todo debes tener cuidado en habilitar luego las "foreign key".

Espero que te sirva, saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Updates en cascada

Publicado por isidroalmaguer (26 intervenciones) el 28/02/2001 08:00:08
hola...

la idea de poner una clave al regsitro es para hacerlo unico y y como que no es logico cambiar la clave de un regsitro... cual es el objetivo..

saludos
isidroalmaguer
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Updates en cascada

Publicado por oracleadicto (4 intervenciones) el 15/03/2001 16:06:42
Hola.

Si trabajas con ORACLE puedes hacerlo... si tienes las constraints preparadas.
Con oracle puedes crear las constrains de una tabla en modo deferrable o en
not deferrable. Este último es el de por defecto.
Si una constraint es deferrable, puedes hacer que no valide las constraints hasta el
final de la transacción, es decir, hasta que haces el commit. Por lo tanto, se pueden
manipular tranquilamente los datos de las tablas maestras aunque se dejen
momentaneamente en un estado "inconsistente" siempre y cuando a la hora de hacer
el commit las hayamos dejado en un estado consistente.

Por lo tanto, en tu caso, si las constraints que te dan el problema las creas como
deferrable, al principio de la transacción pones: "set constraints xxxx, xxxx deferred;"
haces la update de c1 a los nuevos valores (y no falla)
haces la update de c2 para que sean hijos de los nuevos valores de c1 (y no falla)
haces la update de c3 que se había quedado huérfana y los emparejas con los
nuevos de c2 y finalmente haces el commit y ¡TACHÁN! todo funciona.

P.D: Si las constraints que tienes no son deferred debes borrarlas y crearlas otra vez
añadiendo la palabra reservada "deferrable" al final.

Un saludo.
---------------------------------------------------------------------------------------------------------------------------------------
Aprende sobre sql, la memoria de oracle y las estructuras de oracle en: http://www.zunda.net
---------------------------------------------------------------------------------------------------------------------------------------
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar