PDA

Ver la Versión Completa : Borrar Registros relacionados


senpiterno
03-11-2004, 08:17:58
Hola amigos...

Mi pregunta es la siguiente....es posible borrar con una sentencia SQL un registro y sus relaciones con otras tablas esclavas, es decir si borramos por ejemplo el registro que hace referencia a una factura, podemos dentro de la misma sentencia SQL borrar tambien el detalle que tenga esta factura en otras tablas (obviamente enlazadas por el campo clave de la tabla maestra). Algo asi como hacer un join entre las tablas relacionadas con el registro a borrar dentro de una sola sentencia detele de SQL.
Y si es posible efectuarlo, se puede implementar dicha sentencia SQL dentro
de la propiedad DeleteSQL de un DataSet.

Gracias por cualquier ayuda

Saludos....

Neftali [Germán.Estévez]
03-11-2004, 09:28:14
Esa información que tú comentas se debe definir en las relaciones entre tablas (CONSTRAINTS), no en la sentencia SQL; No comentas qué Base de Datos utilizas, pero por lo general es así (no se si habrá alguna excepción, pero yo no la conozco).

En el ejemplo que tú comentas, cuando defines el constraint entre la tabla factura y sus relacionadas deberás decir si deseas borrados en cascada (también puedes hacerlo con los UPDATES), de forma que cuando borras una factura se borrarán sus relacionadas, pero no es una cosa que se define en cada sentencia SQL, sino que es un comportamiento para todos los registros de esa tabla.

En SQLServer, por ejemplo, al definir el constaint podrías añadir lo siguiente:

(extraído de la ayuda...)

FOREIGN KEY REFERENCES ref_table ref_column
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]

senpiterno
03-11-2004, 18:57:41
Gracias amigo Neftali por tu respuesta, efectivamente en los CONSTRAINTS de las tablas relacionadas tengo definidos el borrado y actualizado en cascada, para cuando uno de los registros maestros sufre algun cambio (delete,edit). Mi pregunta iva enfocada a si en la sentencia delete (previamente informada la propiedad DeleteSQL) de un dataset, se podia incluir el borrado de registos de mas de una tabla (cuando existen relaciones entre estas).
Por cierto que en teoria, es el sevidor el que se encarga de borrar en cascada cuando se elimina un registro maestro que tenga relaciones en otras tablas. Pero aqui me asalta otra duda, como saber si efectivamente ese borrado en cascada se efectuo exitosamente, o es que si ocurre algun error o inconveniente durante el borrado en cascada, se cancela la eliminacion completa arrojando una excepcion.....
Como Base de datos utilizo Interbase 6.0 y componentes IBX para el acceso a datos, mas explicitamente Dataset

Neftali [Germán.Estévez]
04-11-2004, 10:31:33
... a si en la sentencia delete (previamente informada la propiedad DeleteSQL) de un dataset, se podia incluir el borrado de registos de mas de una tabla (cuando existen relaciones entre estas).
Creeo que en la sentencioa SQL no vas a poder hacerlo (en una única).

......como saber si efectivamente ese borrado en cascada se efectuo exitosamente, o es que si ocurre algun error o inconveniente durante el borrado en cascada, se cancela la eliminacion completa arrojando una excepcion...
Bueno, supongo que ese borrado en cascada se efectua utilizando transacciones y "quiero creer" que si por alguna razón el borrado falla no se dejan cosas a medias, si alguien lo sabe seguro que lo confirme (ésto es una suposición); Si no es así yo realizaría el borrado en cascada manualmente utilizando una transacción de forma que el proceso se realize completo o no se haga.