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 20-04-2010
Kubelo Kubelo is offline
Miembro
 
Registrado: feb 2010
Posts: 58
Poder: 15
Kubelo Va por buen camino
Borrar clave ajena sin nombre

Buenos días, quería saber si existe la opción (o instrucción) para en una base de datos Firebird eliminar claves ajenas que no tienen nombre, es decir que son del tipo INTEG_XXXX. En su día no se les puso nombre, o sea se crearon con la instrucción "ALTER TABLE FACTURAS ADD FOREIGN KEY (CLIENTE) REFERENCES CLIENTES (CODIGO)" Y ahora se quieren modificar esas claves ajenas, y claro lo más rápido es preparar un "script" pero desconozco si puedo eliminar todas las claves ajenas que no tienen nombre de algun modo rápido.

Gracias!
Responder Con Cita
  #2  
Antiguo 20-04-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola.

Aunque tu no les pusieras nombre, el sistema les asignó uno, así que solo tienes que utilizar un Administrador de Firebird, como el IB-Expert, para ver que nombre les asignó, y crear un script en consecuencia.

http://ibexpert.net/ibe/index.php?n=...ersonalEdition

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #3  
Antiguo 20-04-2010
Kubelo Kubelo is offline
Miembro
 
Registrado: feb 2010
Posts: 58
Poder: 15
Kubelo Va por buen camino
Si, correcto, el problema que tengo (veo que no me he explicado bien, perdón!, jeje) es que el "script" va a ser utilizado en muchas BBDDs iguales, con lo cual en cada una de ellas tendrá un nombre distinto, es por ello por lo cual necesito un "estandar" o algo similar para realizar el borrado de estas claves sin tener que ver el nombre en cada BBDD.

Gracias!
Responder Con Cita
  #4  
Antiguo 20-04-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola.

Ahora comprendo el problema.

Puedes utilizar las tablas de sistema para identificar todas las claves foráneas de tu tabla, y después con un EXECUTE STATEMENT, eliminarlas.

Tablas de Sistema de Firebird :

http://www.alberton.info/firebird_sql_meta_info.html

En concreto, creo que necesitas :

SELECT RDB$INDEX_NAME
FROM RDB$INDICES
WHERE RDB$RELATION_NAME='Nombre de la Tabla'
AND RDB$FOREIGN_KEY IS NOT NULL

Funcionamiento del EXECUTE STATEMENT :

http://www.firebirdsql.org/refdocs/l...-execstat.html

NOTA: Esto lo puedes hacer, por ejemplo en un procedimiento almacenado (con un bucle FOR sobre el SELECT para las claves foráneas). Por lo que tu script daría de alta el procedimiento almacenado, lo ejecutaría con un "execute procedure" y finalmente lo eliminaría.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #5  
Antiguo 20-04-2010
Kubelo Kubelo is offline
Miembro
 
Registrado: feb 2010
Posts: 58
Poder: 15
Kubelo Va por buen camino
Por ahí deben ir los tiros, pero ejecutando la select que me pasas solo obtengo 9 claves ajenas a mi tabla de clientes, y a partir del script he visto que en la BBDD que estoy analizando hay 32! Así que no me las muestra todas.

No habría manera de eliminar todas las claves ajenas que apuntan a una tabla y luego las vuelvo a generar?

Gracias de nuevo!
Responder Con Cita
  #6  
Antiguo 20-04-2010
Kubelo Kubelo is offline
Miembro
 
Registrado: feb 2010
Posts: 58
Poder: 15
Kubelo Va por buen camino
Creo y digo creo pq el tema de los índices no lo domino mucho, así que puede que suelte alguna barbaridad.

Creo que las claves ajenas que me muestra tu select son las que tienen algún índice asociado, eso quiere decir que el resto no tienen ninguno. No se si voy por buen camino...

Gracias de nuevo
Responder Con Cita
  #7  
Antiguo 20-04-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Que yo sepa no hay ninguna instrucción SQL que haga exactamente eso, y por lo que respecta a que solo veas 9 índices en lugar de 32, creo que deberías asegurarte con un Administrador como el IB-Expert en lugar de basarte solo en los scripts (puede ser que ya se hayan borrado algunos de esos índices).

Ya que en las tablas de Metadata tienes toda la información de la base de datos, así que si un índice existe, tiene que estar en la tabla rdb$indices.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #8  
Antiguo 20-04-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Cita:
Empezado por Kubelo Ver Mensaje
Creo que las claves ajenas que me muestra tu select son las que tienen algún índice asociado, eso quiere decir que el resto no tienen ninguno. No se si voy por buen camino...>
Sí, pero es que hasta donde yo sé siempre que declaras una clave foránea, se crea un índice asociado.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #9  
Antiguo 20-04-2010
Kubelo Kubelo is offline
Miembro
 
Registrado: feb 2010
Posts: 58
Poder: 15
Kubelo Va por buen camino
Si si, confirmado las 32 claves ajenas (bueno valeeee, la mayoría no he comprobado las 32 ) si que existen, pero en la select solo me muestra una parte.
Responder Con Cita
  #10  
Antiguo 20-04-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Esa consulta la he sacado a botepronto, si no funciona entonces tienes que leer la documentación disponible de los metadatos en Firebird, para ver donde está el problema y determinar la consulta correcta.

http://www.alberton.info/firebird_sql_meta_info.html

http://www.felix-colibri.com/papers/...em_tables.html

http://www.chillisoft.co.za/blog/?p=165

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #11  
Antiguo 20-04-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Kubelo, la consulta para obtener las claves foraneas, creo que debería ser esta:

Código SQL [-]
Select *
From RDB$RELATION_CONSTRAINTS
Where RDB$CONSTRAINT_TYPE='FOREIGN KEY'

para borrar:

Código SQL [-]
Delete From RDB$RELATION_CONSTRAINTS
Where RDB$CONSTRAINT_TYPE='FOREIGN KEY'

pero no te borra el campo, solo la relación que has hecho para que sea clave foranea.

Para borrar el campo fisicamente tendras que hacerlo con Alter Table Tabla Drop ....

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #12  
Antiguo 20-04-2010
Kubelo Kubelo is offline
Miembro
 
Registrado: feb 2010
Posts: 58
Poder: 15
Kubelo Va por buen camino
Talking

Eso no me sirve Caro, ya que borra todas las claves ajenas y solo necesitaba que se me borren las que apunten a la tabla que yo decido.

Dicho esto os pongo la solución que al final dimos con ella! Jeje

DELETE FROM RDB$REF_CONSTRAINTS
WHERE RDB$CONST_NAME_UQ = (select RDB$CONSTRAINT_NAME from RDB$RELATION_CONSTRAINTS
WHERE
RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' AND
RDB$RELATION_NAME = 'CLIENTES')

Esto borra todas las claves ajenas (TABLA REF_CONSTRAINTS) que apuntan a la tabla cuya clave primaria tiene como identificador la segunda select.

Gracias por la ayuda prestada, me iré a casa con una sonrisa hoy
Responder Con Cita
  #13  
Antiguo 20-04-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por Kubelo Ver Mensaje
Eso no me sirve Caro...........................
, si querías de una tabla especifica en mi consulta solo faltaba preguntar por esa tabla en el where:

Código SQL [-]
Delete From RDB$RELATION_CONSTRAINTS
Where RDB$CONSTRAINT_TYPE='FOREIGN KEY' and RDB$RELATION_NAME = 'CLIENTES'

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
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
Borrar con ADO.NET sin Clave Principal camomilass Conexión con bases de datos 2 15-01-2007 17:24:03
Extraer datos de una pagina en java que tiene clave (sabiendo la clave claro) ;) kalimocho Internet 2 29-06-2005 05:11:24
"Dexter" nombre clave de Delphi 2006 Epachsoft Noticias 4 19-06-2005 18:49:16
Borrar clave en tabla paradox CFPA86 Varios 1 17-08-2004 12:37:55
Problemas violación clave ajena desde Builder melanthea C++ Builder 5 25-06-2004 18:42:11


La franja horaria es GMT +2. Ahora son las 02:11:56.


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