PDA

Ver la Versión Completa : Claves referenciales


sur-se
29-11-2007, 13:12:19
Hola. No sé porque están complicado añadir claves referenciales a las tablas. El problema que siempre me aparece es que la tabla a la que apunta la clave refencial está en uso. Se tiene que salir todos la base de datos o al menos dejar de usar esa tabla para poder crear una clave referencial.
Me parece una tontería y en otros sistemas de bases de datos eso no es necesario, pudiendo crear las claves referenciales sin ningún problema.
Me explico mejor. Tengo dos tablas, A y B. En la tabla A existe un campo que debe apuntar mediante una clave referencia a otro de la tabla B (su clave primaria).
Entonces añado en la tabla A una clave referencial sobre uno o más campos (según sea la clave primaria de B). Podría entender que la tabla A no puede estar en uso por ningún usuario, ya que hay que modificar algo internamente, supongo, así como generar el índice automático que crea firebird por cada clave referencial, pero que sea necesario que la tabla B tampoco esté en uso, me parece algo absurdo y que me da bastante problemas, sobre todo en los procesos de actualización.
¿Alguien sabe como se puede resolver esto?
Un saludo.

Lepe
29-11-2007, 14:06:09
Edito: Tu mensaje no tiene sentido alguno.

Si la tabla B ya tiene datos en su clave primaria, añadir registros en A no tiene historia alguna, y no se produce el efecto que comentas, algo estás haciendo mal.

Explica con más detalle lo que quieres hacer.

Yo tengo una factura, puedo añadir miles de lineas de detalle a esa factura sin producir ningún error.

Si se modifica la clave primaria de la tabla factura, mientras otro usuario quiere modificar líneas de factura, eso ya es otra cosa!!

Saludos

sur-se
29-11-2007, 16:08:40
Hola. Gracias por la contestación pero creo que no has entendido el problema.
En ningún caso menciono la introducción de datos. Estoy hablando de la estructura y la creación de claves referenciales en dicha estructura (no de los datos).
Pongo un ejemplo más claro:
Tengo una tabla que se llama, por ejemplo, EQUIPOS, cuyos campos son:
- codigo_equipo (clave primaria)
- nombre_equipo

Ahora otro día, voy y quiero crear una tabla PERSO_EQ (personas del equipo). Entonces esta nueva deberá tener los campos:
- codigo_equipo (para referenciar al equipo al que pertenece)
- codigo_persona
- nombre_persona
La clave primaria de esta nueva tabla es "codigo_equipo, codigo_persona". ahora bien, también tengo que añadir una clave referencial a la tabla PERSO_EQ que apunta al tabla EQUIPOS a través del campo codigo_equipo.
Pues bien, al crear esta clave referencial en la tabla PERSO_EQ, si la tabla EQUIPOS está en uso (alguien la tiene simplemente abierta en un dbgrid), pues no te deja introducir la clave referencial y te da el mensaje "la tabla EQUIPOS está en uso". Se tienen que salir todos de la tabla EQUIPOS para poder crear la clave referencia en la tabla PERSO_EQ.
Ahí es donde no le veo sentido, pues aunque se necesite la tabla equipos para chequear claves referenciales, no voy a modificar su estructura, pues entiendo que me debería dejar crearla, pero no es así.
Espero con el ejemplo aclarar el problema que se me plantea y que me gustaría solucionar de alguna manera, que no sé como ....
Un saludo.

sur-se
29-11-2007, 16:27:27
Me respondo mi mismo.... je je. Después de seguir investigando un poco sobre el tema (pues con anterioridad no le había dado importancia pero ahora que necesito realizar actualizaciones masivas y automáticas es un verdadero problema) he encontrado un topic en la página de ibphoneix sobre el asunto y no tiene solución. Interbase (y con ello supongo que firebird aunque no sé si en la versión 2.0 sigue así, pues yo uso la 1.5) requiere un acceso en exclusiva a la base de datos para poder crear claves referenciales.
Aquí dejo el link del mismo:
http://www.ibphoenix.com/main.nfs?a=ibphoenix&l=;KNOWLEDGEBASE;ID='81'
Así pues, problema sin solución.
Vaya...:mad:

Lepe
29-11-2007, 17:05:12
La modificación de los metadatos de una BBDD no es libiano. con solo la creación de una base de datos, ya se crean 30 tablas de sistema y se rellenan muchos registros.

Querer hacer eso en tiempo de ejecución, y más todavía en producción, me parece, por no decir otra cosa, temerario :D.

Si no le ves sentido, te aconsejo literatura de Firebird "A Firebird book" de Helen Borrie es un buen comienzo. Entenderás por qué se hacen las cosas así.

¿Automatizable? por supuesto, crear un mensaje en la base de datos y ejecutarlo desde tu puesto, haciendo que informe a todos los terminales que se va a proceder a un mantenimiento general; si en 1 minuto no cierra la aplicación, la cierras tú por código (para aquellos usuarios que estén tomando café con su conexión abierta ;)). Incorporas un script con todas las modificaciones y a correr.

La implementación de esto.... ¿1 o 2 horas con testeo incluido?

Saludos

tefots
29-11-2007, 20:23:58
puedes hacer un shutdown de la base de datos, forzando a desconectarse a los usuarios que esten accediendo.
luego haces las actualizaciones , y vuelves a pones la bd online.

pero claro , deberias avisar a los usuarios de alguna forma para que no pierdan datos , que guarden y se salgan temporalmente hasta que reciban aviso que ya pueden continuar.

saludos.

sur-se
30-11-2007, 11:42:02
Hola. El problema es ese, que no quería que la gente se tuviese que salir, porque existen actualizaciones "light" que en verdad no necesitarían parar el trabajo de todos.
Pero visto los requisitos del Firebird, pues nada, no hay otra que sacarlos a todos.
Lo que ocurre es que también trabajo con otro motor de bases de datos (ctsql) y en ese no es necesario, por eso me llamó más la atención el no poder hacerlo.
Pero bueno ... eso es lo que hay.
Saludos.

Lepe
30-11-2007, 13:49:29
Pero bueno ... eso es lo que hay.
Hombre, esa no es la actitud que debes mostrar. Que se sepa quien es el que manda en el sistema :D , esa, esa es la actitud adecuada :D.

Saludos

RolphyReyes
30-11-2007, 14:12:20
Saludos.

No tengo mucho conocimiento sobre como se comportan todas las BD (Firebird, Oracle, SQL Server...) pero cualquier motor de BD necesita uso exclusivo de la BD si se va a modificar su metadata.

Por hacer una comparacion, cuando estas haciendo insercion, actualizacion, borrado y demas eso seria como hacer un Backup, ahora cuando deseas modificar la metadata de la BD es como hacer un Restore en caliente osea con usuarios utilizando la BD.

Espero haber sido lo bastante claro.

Hasta luego.