Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-11-2007
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Poder: 21
sur-se Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 29-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 29-11-2007
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Poder: 21
sur-se Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 29-11-2007
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Poder: 21
sur-se Va por buen camino
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...
Responder Con Cita
  #5  
Antiguo 29-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 29-11-2007
tefots tefots is offline
Miembro
 
Registrado: feb 2005
Posts: 108
Poder: 20
tefots Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 30-11-2007
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Poder: 21
sur-se Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 30-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por sur-se
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 , esa, esa es la actitud adecuada .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 30-11-2007
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Talking

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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 11:10:35.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi