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:
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
Respuesta Responder a este mensaje
#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:
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:
> 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


Respuesta Responder a este mensaje
#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:
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:
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:
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
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida