FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Claves referenciales
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. |
#2
|
||||
|
||||
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 29-11-2007 a las 14:13:57. |
#3
|
|||
|
|||
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. |
#4
|
|||
|
|||
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... |
#5
|
||||
|
||||
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 . 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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#6
|
|||
|
|||
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. |
#7
|
|||
|
|||
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. |
#8
|
||||
|
||||
Cita:
Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#9
|
||||
|
||||
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.
__________________
Gracias, Rolphy Reyes |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Error con claves foráneas | david.rguez | MySQL | 1 | 08-02-2007 13:51:42 |
claves | berfer | Windows | 3 | 29-09-2006 22:03:27 |
Claves Ado | soloriv | Conexión con bases de datos | 2 | 04-04-2006 17:54:16 |
Manipular claves con UDF | jwmoreira | Firebird e Interbase | 1 | 28-07-2005 22:52:48 |
Generar claves en registro | Pablo Carlos | API de Windows | 2 | 02-07-2004 00:57:43 |
|