En realidad en forosdelweb casi siempre he encontrado las soluciones a mis dudas. Seré breve con mi explicación:
Tengo 2 tablas:
Paises
-Id (Clave primaria)
-Nombre
Persona
-Id (Clave primaria)
-Nombre
-Apellido
-IdPaisOrigen (Clave foránea)
-IdPaisResidencia (Clave foránea)
De esta forma, a cada persona puedo asignarle un país de origen y un país de residencia.
Las relaciones serían:
1) Pais.Id <--> Persona.IdPaisOrigen
2) Pais.Id <--> Persona.IdPaisResidencia
El problema está cuando en SQL Server (2008) Management Studio, intento hacer las restricciones de integridad referencial en cascada para ambas relaciones. Aparentemente, no puedo/debo crear más de una relación (usando restricciones de casacada) con la misma tabla.
El mensaje de error que aparece (al intentar crear la segunda relación) es:
Cita:
No se puede crear la relación 'FK_Persona_PaisResidencia'.
Si especifica la restricción FOREIGN KEY 'FK_Persona_PaisResidencia' en la tabla 'Persona', podrían producirse ciclos o múltiples rutas en cascada. Especifique ON DELETE NO ACTION o UPDATE NO ACTION, o bien modifique otras restricciones FOREIGN KEY.
Si especifica la restricción FOREIGN KEY 'FK_Persona_PaisResidencia' en la tabla 'Persona', podrían producirse ciclos o múltiples rutas en cascada. Especifique ON DELETE NO ACTION o UPDATE NO ACTION, o bien modifique otras restricciones FOREIGN KEY.
¿Qué opinan? Cómo puedo estalecer las restricciones en cascada para estas relaciones? Será un error de diseño de mi modelo E/R? Se solucionará planteándolo de una forma alternativa? Tendré que usar "Desencadenadores" para esta simple relación?
La documentación oficial (SQL Server 2005) dice:
Cita:
Fuente: technet.microsoft.com/es-es/library/ms186973(SQL.90).aspxLas series de acciones referenciales en cascada desencadenadas por DELETE o UPDATE deben formar un árbol que no contenga referencias circulares. Ninguna tabla puede aparecer más de una vez en la lista de todas las acciones referenciales en cascada que se obtienen de DELETE o UPDATE. Además, el árbol de acciones referenciales en cascada no puede tener más de una ruta de acceso a una tabla determinada. Las ramas del árbol se terminan cuando encuentran una tabla para la que se haya especificado NO ACTION o cuando éste sea su valor predeterminado.
Encontré un tema similar a mi duda acá:
forosdelweb.com/f87/no-deja-crear-eliminacion-cascada-422186
pero quedó inconcluso.
Desde ya, muchas gracias. Agradeceré enormemente las ayudas.