Autor Tema: Relaciones recursivas en SQL Server  (Leído 11979 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado kerberoz

  • Trade Count: (0)
  • The Communiter-
  • *
  • Thank You
  • -Given: 25
  • -Receive: 30
  • Mensajes: 3717
Relaciones recursivas en SQL Server
« : 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.
El aguinaldo es un invento comunista; pero eso no te molesta, ¿Verdad?

Desconectado NIGHTGHOST

  • Ghost User -
  • -^- Elite Gold -^-
  • Trade Count: (6)
  • The Communiter-
  • **
  • Thank You
  • -Given: 0
  • -Receive: 13
  • Mensajes: 2001
  • I'm Sparky... I'm NightWolf... User SVC
Re: Relaciones recursivas en SQL Server
« Respuesta #1 : octubre 12, 2005, 08:23:08 am »
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?

Citar
--------------------------------------------------
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..........
« Última Modificación: octubre 12, 2005, 08:42:16 am por NIGHTGHOST »


Desconectado mxgxw

  • Global Moderator
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 27
  • -Receive: 652
  • Mensajes: 5660
  • Starlet - 999cc
    • mxgxw
Re: Relaciones recursivas en SQL Server
« Respuesta #2 : octubre 12, 2005, 11:05:22 am »
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


Desconectado kerberoz

  • Trade Count: (0)
  • The Communiter-
  • *
  • Thank You
  • -Given: 25
  • -Receive: 30
  • Mensajes: 3717
Re: Relaciones recursivas en SQL Server
« Respuesta #3 : octubre 12, 2005, 11:16:13 am »
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.
« Última Modificación: octubre 12, 2005, 11:27:47 am por kerberoz »
El aguinaldo es un invento comunista; pero eso no te molesta, ¿Verdad?

Desconectado Tio B

  • -^- Elite Gold -^-
  • Trade Count: (5)
  • The Communiter-
  • **
  • Thank You
  • -Given: 123
  • -Receive: 76
  • Mensajes: 10251
  • Vendo nanosuit barato, poco uso
Re: Relaciones recursivas en SQL Server
« Respuesta #4 : octubre 12, 2005, 11:24:28 am »
lectura acerca de las bases de datos relacionales
Código: [Seleccionar]
http://www.programatium.com/manuales/sql/modrel003.htm

Desconectado °o.O[ F®ªnk ]O.o°

  • -^- Elite Gold -^-
  • Trade Count: (4)
  • The Communiter-
  • **
  • Thank You
  • -Given: 0
  • -Receive: 0
  • Mensajes: 2172
Re: Relaciones recursivas en SQL Server
« Respuesta #5 : octubre 12, 2005, 11:38:03 am »
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

NO FUMEN!!!, es por su bien
LORD KARLITOZ, TE EXTRAÑAREMOS

Desconectado mxgxw

  • Global Moderator
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 27
  • -Receive: 652
  • Mensajes: 5660
  • Starlet - 999cc
    • mxgxw
Re: Relaciones recursivas en SQL Server
« Respuesta #6 : octubre 12, 2005, 05:44:21 pm »
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


Desconectado °o.O[ F®ªnk ]O.o°

  • -^- Elite Gold -^-
  • Trade Count: (4)
  • The Communiter-
  • **
  • Thank You
  • -Given: 0
  • -Receive: 0
  • Mensajes: 2172
Re: Relaciones recursivas en SQL Server
« Respuesta #7 : octubre 12, 2005, 08:45:54 pm »
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

NO FUMEN!!!, es por su bien
LORD KARLITOZ, TE EXTRAÑAREMOS

sicario

  • Visitante
  • Trade Count: (0)
Re: Relaciones recursivas en SQL Server
« Respuesta #8 : octubre 29, 2005, 02:59:15 am »
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