Pregunta de novato

23/10/2003 - 21:18 por Temiscotles | Informe spam
Saludos
Estoy haciendo una base de datos e intento relaciona 3 tablas.

Me aparece el siguiente mensaje

Unable to create relationship 'FK_CursoPuedeDar_Profesor'.
ODBC error: [Microsoft][ODBC SQL Server Driver][SQL Server]Introducing
FOREIGN KEY constraint 'FK_CursoPuedeDar_Profesor' on table 'CursoPuedeDar'
may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or
ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
[Microsoft][ODBC SQL Server Driver][SQL Server]Could not create constraint.
See previous errors.

Tengo dos tablas, cada una con indices que lo forman 1 o más campos (Tabla1
y Tabla2). Intento relacionar cada una de estas dos tablas con una tercera
(Tabla3) que incluye los campos de las dos con la que se van relacionar y
que conforman el indice de la tercera y me dá el siguiente este mensaje.
Otra cosa, le configura que se dé la actualizacion en cascada de las tablas
1 y 2 a la Tabla3

Tabla1 Tabla2 Tabla3
idCompania idCompania idCompania
idPersona idCurso idCurso
Nombre NombreCurso idPersona
...
Como soluciono esto ?
Espero que me entiendan
Gracias

Preguntas similare

Leer las respuestas

#1 Javier Loria
25/10/2003 - 01:09 | Informe spam
Hola:
Es mucho mas facil si nos envias el codigo de las tablas.
En tu caso es probable que tengas una Tabla de Companias que tiene
tambien una relacion foranea con la Tabla de Cursos (Tabla2) y con la Tabla
de Profesores (Tabla1). Estas relaciones si estan deben estar definidas con
la Opcion de ON DELETE CASCADE y ON UPDATE CASCADE.
Esto produce un efecto "multiple" sobre la tabla CursoPuedeDarProfesor
(Tabla3), ya que el el borrado de una compania, produce que se eliminen
todos los Profesores y todos los cursos, y ahora la cascada continua y ahora
las tablas de Profesores y Cursos quieren borrar (ambas) los
CursosPuedenDar_Profesor.
Tomado de los BOL:
Las 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. El árbol de
acciones referenciales en cascada no debe tener más de una ruta de acceso a
una tabla específica. 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
= Por otra parte y mas importante realmente quieres que si alguien borrar
una compania, se autodestruya la BD?

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Temiscotles escribio:
Mostrar la cita
#2 Temiscotles
27/10/2003 - 22:17 | Informe spam
Saludos y gracias.

Efectivamente mi caso es ese que apuntas.

Mi tabla cursos que puede dar un profesor tiene una relacion hacia la tabla
de profesores, la cual esta configurada para actualizacion en cascada
CREATE TABLE [CursoPuedeDar] (
[IdCompania] [int] NOT NULL ,
[IdProfesor] [int] NOT NULL ,
[IdArea] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[IdPrograma] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[IdCurso] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
CONSTRAINT [PK_CursoPuedeDar] UNIQUE NONCLUSTERED
(
[IdCompania],
[IdProfesor]
) ON [PRIMARY] ,
CONSTRAINT [PK_CursoPuedeDar1] UNIQUE NONCLUSTERED
(
[IdCompania],
[IdArea],
[IdPrograma],
[IdCurso]
) ON [PRIMARY] ,
CONSTRAINT [FK_CursoPuedeDar_Profesor] FOREIGN KEY
(
[IdCompania],
[IdProfesor]
) REFERENCES [Profesor] (
[IdCompania],
[IdProfesor]
) ON UPDATE CASCADE
) ON [PRIMARY]
-
Al intetar hacer otra relacion con la tabla curso y configurarle la
actuliazación en cascacda que es lo unico que me interesa ( no me interesa
el borrado en cascada) se presenta este mensaje. Ahora si esto no es
posible de hacer como si se hacia en Access, cual sería una posible solucion
(si no es mucha la molestia). La idea es poder definir los cursos que puede
dar un profesor, ya que un mismo profesor puede dar un o más cursos y los
datos del profesor y cursos salen de las tablas profesor y cursos.

Gracias
-
CREATE TABLE [Curso] (
[IdCompania] [int] NOT NULL ,
[idArea] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[idPrograma] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[idCurso] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Nombre] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[idNivel] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[idCuenta] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Estado] [bit] NULL ,
CONSTRAINT [PK_Curso] PRIMARY KEY CLUSTERED
(
[IdCompania],
[idArea],
[idPrograma],
[idCurso]
) ON [PRIMARY] ,
CONSTRAINT [FK_Curso_Nivel] FOREIGN KEY
(
[IdCompania],
[idArea],
[idPrograma],
[idNivel]
) REFERENCES [Nivel] (
[IdCompania],
[idArea],
[idPrograma],
[idNivel]
),
CONSTRAINT [FK_Curso_Programa] FOREIGN KEY
(
[IdCompania],
[idArea],
[idPrograma]
) REFERENCES [Programa] (
[IdCompania],
[IdArea],
[IdPrograma]
) ON UPDATE CASCADE
) ON [PRIMARY]

CREATE TABLE [Profesor] (
[IdCompania] [int] NOT NULL ,
[IdProfesor] [int] NOT NULL ,
[Nombre] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Apellido1] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Cedula] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Pasaporte] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Sexo] [bit] NULL ,
[EstadoCivil] [int] NULL ,
[FecNacimiento] [datetime] NULL ,
[FecIngreso] [datetime] NULL ,
[FecEgreso] [datetime] NULL ,
[TelCasa] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[TelTrabajo] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[TelCelular] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Beeper] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Email] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Email1] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[IdPais] [int] NULL ,
[IdProvincia] [int] NULL ,
[IdCanton] [int] NULL ,
[IdDistrito] [int] NULL ,
[Direccion] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Estado] [bit] NULL ,
CONSTRAINT [PK_Profesor] PRIMARY KEY CLUSTERED
(
[IdCompania],
[IdProfesor]
) ON [PRIMARY] ,
CONSTRAINT [FK_Profesor_Compania] FOREIGN KEY
(
[IdCompania]
) REFERENCES [Compania] (
[IdCompania]
) ON UPDATE CASCADE ,
CONSTRAINT [FK_Profesor_Distrito] FOREIGN KEY
(
[IdProvincia],
[IdCanton],
[IdDistrito]
) REFERENCES [Distrito] (
[IdProvincia],
[IdCanton],
[IdDistrito]
) ON UPDATE CASCADE ,
CONSTRAINT [FK_Profesor_Pais] FOREIGN KEY
(
[IdPais]
) REFERENCES [Pais] (
[IdPais]
) ON UPDATE CASCADE
) ON [PRIMARY]
"Javier Loria" escribió en el mensaje
news:
Mostrar la cita
Tabla
Mostrar la cita
con
Mostrar la cita
ahora
Mostrar la cita
o
Mostrar la cita
Ninguna
Mostrar la cita
a
Mostrar la cita
una
Mostrar la cita
valor
Mostrar la cita
borrar
Mostrar la cita
#3 Javier Loria
28/10/2003 - 04:01 | Informe spam
Hola:
Umm, ese cccncr me suena conocido ;)
La alternativa no es tan facil, podrias crear un procedimiento
almacenado que haga la modificacion en cascada de las tablas. Podrias no
poner una accion entre Compania y Cursos o no poner la relacion entre
Compania y Profesores. Eventualmente podrias escribir un Trigger que realice
las actualizaciones.
Debes mantener en cuenta la siguiente limitacion:
Tomado del BOL
Las 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. El árbol de
acciones referenciales en cascada no debe tener más de una ruta de acceso a
una tabla específica. 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.
=Yo personalmente no soy muy amigo del ON UPDATE CASCADE, ya que me parece
"demasiado automatico" y facil introducir problemas de integridad, cuando
permites que los usuarios cambien las llaves primarias con tanta facilidad.

Un ejemplo lo puedes ver asi:
El usuario cambia el numero de CIA de 1 a 10.
El usuario cambia el numero de CIA de 2 a 1.
Realiza alguna accion (facturar, hacer un cheque, recibir dinero etc.),
en los documentos aparece impreso Compania 1.
El usuario cambia la compania 1 a 2.
El usuario cambia la compania 10 a 1.
=Ojo que esto lo he visto con codigos de productos en sistemas de facturacion
aqui en Costa Rica, no es un caso hipotetico.

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Temiscotles escribio:
Mostrar la cita
Ads by Google
Search Busqueda sugerida