Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Borrado con integridad referencial (https://www.clubdelphi.com/foros/showthread.php?t=87357)

doctorhd 19-12-2014 17:22:21

Borrado con integridad referencial
 
Hola estimados, tengo el siguiente problema:
Estoy borrando datos de una tabla padre que tiene relacionada una tabla hija, dicha tabla hija tiene como foreign key el campo clave de la tabla padre(que hace la relación), como existe integridad referencial entre las tablas primero borro los datos de la tabla hija y después del padre, para no generar un error de violación, ambos procesos se ejecutan bajo una misma transacción, pero en dos procedimientos almacenados distintos(uno borra los hijos y el otro borra el padre). El problema es que aun borrando los hijos primero al borrar el padre, me envía un error de violación de clave foranea. Bajo mi lógica si borro primero los hijos y después el padre esto no debería ocurrir a menos que la transacción no este leyendo el borrado efectuado. Uso Firebilrd 2.5 y componentes FireDac para el acceso a los datos y transacciones.

Espero me puedan ayudar, gracias...

Casimiro Notevi 19-12-2014 18:02:12

Lo lógico, si emite un error de integridad referencial es que... haya un error de integridad referencial. Revisa mejor el código y síguelo paso a paso.

doctorhd 19-12-2014 18:25:09

Casimiro, es evidente que es un error de integridad referencial...he revisado mi código varias veces y no veo problema en el. Déjame cambiar un poco la pregunta inicial, ya que creo que el error va por el lado de la transacción. Si ejecuto el borrado de la tabla hijo bajo la misma transacción que ejecuto el borrado de la tabla padre....la tabla padre se entera de que he borrado los hijos...obviamente todo antes de realizar el commit, ya que todo ocurre en una sola transacción.

Casimiro Notevi 19-12-2014 18:41:51

Así debe ser, efectivamente.

doctorhd 19-12-2014 18:55:58

Casimiro, podrías ser un poco mas explicito..

Casimiro Notevi 19-12-2014 19:04:15

No entiendo, es que no has hecho ninguna pregunta :confused:

doctorhd 19-12-2014 19:11:27

Me refiero a que seas mas explicativo con tu comentario:
Cita:

Así debe ser, efectivamente.
Estas afirmando que esto es correcto:
Cita:

Si ejecuto el borrado de la tabla hijo bajo la misma transacción que ejecuto el borrado de la tabla padre....la tabla padre se entera de que he borrado los hijos..???
nose si me hago entender...

Casimiro Notevi 19-12-2014 19:22:21

Sí, correcto, porque están en la misma transacción.
Aunque si quieres, también puedes borrar los datos de la tabla hija. Confirmar la transacción. Borrar de la tabla padre. Confirmar otra transacción.

cloayza 22-12-2014 15:58:58

Amigo y por que no dejas a Firebird que se encarge de ese trabajo...

Código SQL [-]
ALTER TABLE TABLA_HIJA ADD CONSTRAINT FK_TABLA_PADRE FOREIGN KEY (ID_PADRE) REFERENCES TABLA_PADRE (ID_PADRE) ON DELETE CASCADE ON UPDATE CASCADE

Así cada vez que borres un registro padre el borrado de sus hijos lo hará firebird...:D

Saludos cordiales

Casimiro Notevi 22-12-2014 16:04:01

Cita:

Empezado por cloayza (Mensaje 486975)
... y por que no dejas a Firebird que se encarge de ese trabajo...

Eso es lo ideal.

doctorhd 23-12-2014 15:42:59

Cita:

Amigo y por que no dejas a Firebird que se encarge de ese trabajo...
Lo voy a probar y les comento...


La franja horaria es GMT +2. Ahora son las 15:32:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi