Sv Community El Salvador
Soporte y Tecnología => Programación => Base de Datos => Mensaje iniciado por: kerberoz en octubre 11, 2005, 06:02:48 pm
-
Hey quisiera saber si, para actualizar y eliminar en cascada una relacion recursiva en SQL server se debe relacionar la tabla con ella misma o con una copia de la misma tabla.
Lo que he intentado hacer es relacionar la tabla con ella misma, pero no se activan las opciones para actualizacion y eliminacion en cascada.
La tabla que estoy diseñando es una especie de catalogo, espero entiendan la duda.
-
Hey quisiera saber si, para actualizar y eliminar en cascada una relacion recursiva en SQL server se debe relacionar la tabla con ella misma o con una copia de la misma tabla.
Lo que he intentado hacer es relacionar la tabla con ella misma, pero no se activan las opciones para actualizacion y eliminacion en cascada.
La tabla que estoy diseñando es una especie de catalogo, espero entiendan la duda.
¿Hey esto es lo que no te furula?
--------------------------------------------------
PARA ELIMINAR REGISTROS
--------------------------------------------------
delete tabla1
from tabla1
where campo1 = xxx and campo2 <> 'yyy'
delete tabla1
from tabla1 as a
where exists (select * from copia_tabla1 as b
where a.ID1 = b.ID1 and
a.campo1 = xxx and a.campo2 <> 'yyy')
-----------------------------------------------------------------------
PARA ACTUALIZAR REGISTROS
-----------------------------------------------------------------------
update tabla1
set campo2 = 'zzz'
from tabla1
where campo1 = xxx and campo2 <> 'yyy'
update tabla1
set campo2 = 'zzz'
from tabla1 as a
where exists (select * from copia_tabla1 as b
where a.ID1 = b.ID1 and
a.campo1 = xxx and a.campo2 <> 'yyy')
MUCHO OJO CON LOS TIPOS DATOS.................................... MUY IMPORTANTE
ESPERO QUE TE SIRVA SI ESTA ES LA DUDA MAN..........
-
Hey quisiera saber si, para actualizar y eliminar en cascada una relacion recursiva en SQL server se debe relacionar la tabla con ella misma o con una copia de la misma tabla.
Lo que he intentado hacer es relacionar la tabla con ella misma, pero no se activan las opciones para actualizacion y eliminacion en cascada.
La tabla que estoy diseñando es una especie de catalogo, espero entiendan la duda.
Mira, yo he hecho eso pero en MySQL, con tablas InnoDB por lo de la integridad referencial.
Al menos en mi caso tenia las referencias asi
ON UPDATE CASTADE ON DELETE NO ACTION
Eso significa que no puedo eliminar un registro padre sin antes haber eliminado todos los registros hijos, La unica forma de eliminar los registros es hacerte una funcion "recursiva" en php, que vaya hasta el ultimo registro hijo y los vaya borrando hacia arriba.
Lastima que ya no tengo el codigo, pero si se puede..
tenes que ir haciendo consultas consecutivas para ir consiguiendo todos los hijos, hasta que encontres un nodo que no tenga mas hijos, entonces lo borras, luego con el siguiente y asi.. la funcion al final no es tan complicada como parece pero si te da un dolor de cabeza por un buen rato
-
Gracias por la respuestas, estan muy interesantes :drinks:.
Lo que sucede es que en SQL Server la actualizacion y eliminacion en cascada se hace de forma automatica, pero al hacer una relacion recursiva estas opciones no se habilitan. Cuando diseñe la base de datos en visio si me lo permitia pero me daba una advertencia y me recomendaba hacer lo que escribio MXGXW. Al exportar el modelo desde visio a SQL Server ya no me aparecia la relacion recursiva y si intentaba hacerla desde SQL Server no me activaba las opcios de actualizacion y eliminacion en cascada.
Bueno pero lo que queria hacer es evitar programar esa parte, pero por lo visto eso me va ha tocar, el codigo y las recomendaciones que me han dado me serviran de mucho, gracias.
-
lectura acerca de las bases de datos relacionales
http://www.programatium.com/manuales/sql/modrel003.htm
-
Yo eso no lo haria con relaciones, en primer lugar no te deja y te dice que estas haciendo una relacion recursiva...
Yo ya lo he hecho pero con triggers, haces un trigger que te borre los datos que vos queres en el momento en que estas eleminando algun registros
-
pero fijate que como el dice, que esta haciendo un cosito con categorias, en realidad sale bastante util pk la relacion te va quedando como un árbol, y en cierta forma puede ser ventaja,pk a la hora de hacer la aplicacion no te va a dejar modificar la estructura del arbol que te queda hasta que ya has eliminado todos los nodos de una rama.
En realidad depende de la aplicacion... para lo de las categorias sale bastante util pk tienes por ejemplo:
IDCategoria , IDCategoriaPadre
Puedes hacerlo en varias tablas, pero siempre vas a tener una tabla con esas dos referencias, y awebo tenes que autoreferenciar pk sino despues se hace un rejalo jejeje, por ejemplo cuando borras una cat padre :P
-
Lo malo es que el SQL Server te tira una insultada cuando tratas de hacer una relacion recursiva, simple y sencillamente te dice que esto puede causarte problemas y no te deja seguir..., yo ya lo he hecho pero con triggers, insisto, la verdad es que no se si se pueda dejar la relacion recursiva, pero a mi no me ha dejado
-
Las bases de datos relacionales permiten las actualizaciones en cascada, empero la eliminación de registros en cascada de una llave principal a foránea es muy peligroso y SQL se resite en hacerlo de forma automática, te recomiendo que unicamente utilices las actualizaciones en cascada y a la hora de eliminar un registro lo hagas mediante un programa.
Suerte. MAN