Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Borrar clave ajena sin nombre (https://www.clubdelphi.com/foros/showthread.php?t=67500)

Kubelo 20-04-2010 11:54:27

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!

guillotmarc 20-04-2010 12:17:03

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.

Kubelo 20-04-2010 12:20:04

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!

guillotmarc 20-04-2010 14:48:40

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.

Kubelo 20-04-2010 15:14:14

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!

Kubelo 20-04-2010 15:20:08

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

guillotmarc 20-04-2010 15:21:35

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.

guillotmarc 20-04-2010 15:22:47

Cita:

Empezado por Kubelo (Mensaje 361203)
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.

Kubelo 20-04-2010 15:23:21

Si si, confirmado las 32 claves ajenas (bueno valeeee, la mayoría no he comprobado las 32 :D) si que existen, pero en la select solo me muestra una parte.

guillotmarc 20-04-2010 15:34:59

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.

Caro 20-04-2010 16:09:33

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

Kubelo 20-04-2010 17:18:35

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 :D

Caro 20-04-2010 17:29:51

Cita:

Empezado por Kubelo (Mensaje 361218)
Eso no me sirve Caro...........................

:confused:, 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


La franja horaria es GMT +2. Ahora son las 04:46:22.

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