error al borrar un registro en una tabla relacionada

30/04/2008 - 20:46 por mecodi | Informe spam
hola:
Tengo problemas al borrar desde el web developer(c# y ADO.NET) un registro
en una tabla almacenada en sql 2005
Tengo 3 tablas relacionadas y con los siguientes campos:

Empleados (IdEmpleado(PK),.)
EmpeadosVehiculos (IdEmpleado,IdVehiculo,FechaInicio,FechaFin), donde
IdEmpleado,IdVehiculo,FechaInicio(PK)
IdEmpleado,FechaInicio(IX), son clave única para que en una fecha 1 empleado
sólo tenga un vehículo.
IdVehiculo,FechaInicio(IX), son clave única para que en una fecha 1 vehículo
sólo pueda estar en 1 empleado.
Vehiculos (IdVehiculo(PK),..)

Un empleado sólo puede tener asignado un vehículo y un vehículo sólo puede
estar en un empleado (para una fecha determinada).
el caso es que al BORRAR 1 vehículo:
* compruebo que para esa fecha no esté asignado, que no aparezca en
EmpleadosVehiculos para esa fecha, hasta ahí todo bien, pero cuando va a
borrar, lanza la siguiente excepcion:
Instrucción DELETE en conflicto con la restricción
REFERENCE "FK_Empleados_Vehiculos_Vehiculos".
El conflicto ha aparecido en la base de datos "recursos",
tabla "dbo.Empleados_Vehiculos",
column 'idVehiculo'
En la relación "FK_Empleados_Vehiculos_Vehiculos", tengo:
Tabla de clave Principal: Vehiculos (IdVehiculo)
Tabla de clave Externa:EmpleadosVehiculos (idVehiculo)
pues un vehículos puede aparecer muchas veces en Empleados_Vehiculos (en
distinta fecha), relación 1 a n

Si alguien me puede ayudar, yo creo que las relaciones están bien, pero algo
falla.
Un saludo.

Preguntas similare

Leer las respuestas

#1 Gux (MVP)
30/04/2008 - 21:01 | Informe spam
Sucede que las restricciones no le van a permitir borrar un Vehiculo cuyo
IdVehiculo exista en alguna fila de la tabla EmpeadosVehiculos, sea cual sea
la fecha.

Usted primero examina la tabla EmpeadosVehiculos y detecta que el IdVehiculo
a borrar no existe para la fecha asignada... pero eso no sirve de nada. La
referencia de integridad exige que no se puede borrar un Vehiculo si su Id
existe en EmpeadosVehiculos.

En su escenario, el uso de triggers podría ser una solución aceptable.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"mecodi" wrote:

hola:
Tengo problemas al borrar desde el web developer(c# y ADO.NET) un registro
en una tabla almacenada en sql 2005
Tengo 3 tablas relacionadas y con los siguientes campos:

Empleados (IdEmpleado(PK),.)
EmpeadosVehiculos (IdEmpleado,IdVehiculo,FechaInicio,FechaFin), donde
IdEmpleado,IdVehiculo,FechaInicio(PK)
IdEmpleado,FechaInicio(IX), son clave única para que en una fecha 1 empleado
sólo tenga un vehículo.
IdVehiculo,FechaInicio(IX), son clave única para que en una fecha 1 vehículo
sólo pueda estar en 1 empleado.
Vehiculos (IdVehiculo(PK),..)

Un empleado sólo puede tener asignado un vehículo y un vehículo sólo puede
estar en un empleado (para una fecha determinada).
el caso es que al BORRAR 1 vehículo:
* compruebo que para esa fecha no esté asignado, que no aparezca en
EmpleadosVehiculos para esa fecha, hasta ahí todo bien, pero cuando va a
borrar, lanza la siguiente excepcion:
Instrucción DELETE en conflicto con la restricción
REFERENCE "FK_Empleados_Vehiculos_Vehiculos".
El conflicto ha aparecido en la base de datos "recursos",
tabla "dbo.Empleados_Vehiculos",
column 'idVehiculo'
En la relación "FK_Empleados_Vehiculos_Vehiculos", tengo:
Tabla de clave Principal: Vehiculos (IdVehiculo)
Tabla de clave Externa:EmpleadosVehiculos (idVehiculo)
pues un vehículos puede aparecer muchas veces en Empleados_Vehiculos (en
distinta fecha), relación 1 a n

Si alguien me puede ayudar, yo creo que las relaciones están bien, pero algo
falla.
Un saludo.
Respuesta Responder a este mensaje
#2 Leonardo Azpurua
01/05/2008 - 00:27 | Informe spam
"mecodi" escribió en el mensaje
news:
hola:
Tengo problemas al borrar desde el web developer(c# y ADO.NET) un registro
en una tabla almacenada en sql 2005
Tengo 3 tablas relacionadas y con los siguientes campos:

Empleados (IdEmpleado(PK),.)
EmpeadosVehiculos (IdEmpleado,IdVehiculo,FechaInicio,FechaFin), donde
IdEmpleado,IdVehiculo,FechaInicio(PK)
IdEmpleado,FechaInicio(IX), son clave única para que en una fecha 1
empleado
sólo tenga un vehículo.
IdVehiculo,FechaInicio(IX), son clave única para que en una fecha 1
vehículo
sólo pueda estar en 1 empleado.
Vehiculos (IdVehiculo(PK),..)

Un empleado sólo puede tener asignado un vehículo y un vehículo sólo puede
estar en un empleado (para una fecha determinada).
el caso es que al BORRAR 1 vehículo:
* compruebo que para esa fecha no esté asignado, que no aparezca en
EmpleadosVehiculos para esa fecha, hasta ahí todo bien, pero cuando va a
borrar, lanza la siguiente excepcion:
Instrucción DELETE en conflicto con la restricción
REFERENCE "FK_Empleados_Vehiculos_Vehiculos".
El conflicto ha aparecido en la base de datos "recursos",
tabla "dbo.Empleados_Vehiculos",
column 'idVehiculo'
En la relación "FK_Empleados_Vehiculos_Vehiculos", tengo:
Tabla de clave Principal: Vehiculos (IdVehiculo)
Tabla de clave Externa:EmpleadosVehiculos (idVehiculo)
pues un vehículos puede aparecer muchas veces en Empleados_Vehiculos (en
distinta fecha), relación 1 a n

Si alguien me puede ayudar, yo creo que las relaciones están bien, pero
algo
falla.



Hola.

Si las relaciones están bien, entonces esta mal permitir la eliminación de
un vehículo que ha sido asignado (aunque no lo esté actualmente).

Puedes especificar, en la relación, que se deben eliminar en cascada los
registros de Empleados_Vehiculos cuando se elimine la fila correspondiente
en la tabla Vehiculos.

O puedes indicar que no se impongan (enforce) las restricciones de
integridad referencial (en cuyo caso la relación sirve como documentación
para quien eamine la BBDD, y tal vez para acelerar algunas consultas).

Pero por lo general no querrás eliminar un vehículo cuya historia puede
tambien formar parte de la historia de los empleados a quienes ha estado
asignado.

Una opción es usar un indicador de estado para el vehículo: si está
inactivo, por ejemplo, no puede ser asignado, ni usado de ninguna manera por
la aplicación, pero sigue soportando las consultas de a quien se asignó y
cuándo. Alternativamente, puedes tener una tabla de vehículos activos y otra
de vehículos históricos. Con la primera ejecutas todas las operaciones, y la
segunda soporta todas las consultas. Cuando eliminas un vehículo lo eliminas
de la tabla de vehículos activos, pero conservas la información en la tabla
de históricos, de donde lo borrarás cuando su historia ya no le interese a
nadie.

Salud!
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida