Pregunta

Para los propósitos de depuración tengo que enviar 1 tabla de una base de datos Firebird 1.5 existente a alguien.

En lugar de enviar toda la db, quiero enviar solo el PP con sólo esta mesa - no hay factores desencadenantes, no hay restricciones. No puedo copiar los datos a otro db porque es precisamente eso que queremos comprobar -. ¿Por qué se da esta una tabla problemas

Me pregunto si hay una manera de eliminar todos los disparadores, todas las limitaciones y todas menos una tabla (utilizando algún truco inteligente con las tablas del sistema o algo así)?

¿Fue útil?

Solución

Usando la herramienta de interfaz gráfica de usuario (personalmente prefiero IBExpert) ejecutar comando siguiente:

select 'DROP TRIGGER ' || rdb$trigger_name || ';' from rdb$triggers
  where (rdb$system_flag = 0 or rdb$system_flag is null)

Copiar resultado en el portapapeles y luego pegar y ejecutar dentro ejecutivo de guión ventana.

Otros consejos

Si la copia de seguridad de base de datos puede cambiar a Firebird 2.1 hay algún cambio en gbak y isql .

  

Algunas herramientas de línea de comandos tienen Firebird   sido suministrada con nuevos interruptores a   suprimir el disparo automático de   trigger:

gbak -nodbtriggers
isql -nodbtriggers
nbackup -T
     

Estos interruptores sólo pueden ser utilizados por el   propietario de la base y SYSDBA.

Puede eliminar todos los disparadores borrando directamente desde la tabla del sistema, así:

delete from rdb$triggers
    where (rdb$system_flag = 0 or rdb$system_flag is null);

Tenga en cuenta que la forma normal de utilizar drop trigger es ciertamente preferible, pero se puede hacer.

También puede caer limitaciones mediante la ejecución de sentencias DDL, pero para enumerar las limitaciones y soltarlos en una secuencia de comandos SQL que se necesita la funcionalidad execute block que Firebird 1.5 no tiene.

Hay declaraciones similares para eliminar otros objetos de la base, pero en realidad se ejecuta con éxito éstos pueden ser mucho más difícil debido a las dependencias entre objetos. No se puede caer ningún objeto en tanto que otro objeto depende de ello. Esto puede convertirse debido realmente difícil de referencias circulares, donde dos (o incluso más) objetos dependen uno del otro, formando un ciclo, por lo que no es una sola que se puede eliminar primero.

La forma de evitar esto es romper una de las dependencias. Un procedimiento, por ejemplo, que tiene dependencias a otros objetos puede ser alterado para tener un cuerpo vacío, después de lo cual no ya no depende de los otros objetos, por lo que se pueden eliminar entonces. Dejar caer las claves externas es otra manera de eliminar las dependencias entre las tablas.

No sé de cualquier instrumento de aplicación una eliminación parcial de tales objetos de la base, su caso de uso es muy lejos de la OMI común. sin embargo, puede echar un vistazo a la FlameRobin código fuente que tiene una cierta cantidad de detección de la dependencia en el código que se utiliza para crear secuencias de comandos DDL o instrucciones de modificación de objetos de la base. Armado con esta información se podría escribir su propia herramienta para hacerlo.

Si es una cosa de una vez puede ser suficiente para hacerlo de forma manual, sin embargo. Utilizar cualquier herramienta de gestión de pájaro de fuego de su elección para eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top