Question

Pour des raisons de débogage je dois envoyer 1 table d'une base de données existante Firebird 1.5 à quelqu'un.

Au lieu d'envoyer l'ensemble db, je veux envoyer juste le db avec juste ce tableau - aucun déclencheur, aucune contrainte. Je ne peux pas copier les données vers un autre db car il est juste que nous voulons vérifier -. Pourquoi celui-table est donnée problèmes

Je me demande s'il y a un moyen de laisser tomber tous les déclencheurs, toutes les contraintes et tous, mais une table (en utilisant une astuce avec les tables système ou donc)?

Était-ce utile?

La solution

En utilisant l'outil GUI (je préfère IBExpert) exécuter la commande suivante:

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

Copier résultat dans le presse-papiers, puis coller et exécuter dans la direction de script fenêtre.

Autres conseils

Si votre sauvegarde de base de données peut passer à Firebird 2.1 il y a un commutateur gbak et isql .

  

Certains outils de ligne de commande Firebird   été fourni avec de nouveaux commutateurs à   supprimer la mise à feu automatique de   triggers:

gbak -nodbtriggers
isql -nodbtriggers
nbackup -T
     

Ces commutateurs ne peuvent être utilisés par le   propriétaire de la base et SYSDBA.

Vous pouvez supprimer tous les déclencheurs par directement les supprimer de la table système, comme suit:

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

Notez que la façon normale d'utiliser drop trigger est certainement préférable, mais il peut être fait.

Vous pouvez également déposer des contraintes en exécutant des instructions DDL, mais d'énumérer les contraintes et les déposer dans un script SQL que vous auriez besoin de la fonctionnalité execute block que Firebird 1.5 n'a pas.

Il y a des déclarations similaires à supprimer d'autres objets de base de données, mais en fait en cours d'exécution avec succès ceux-ci peuvent être beaucoup plus difficile en raison de dépendances entre les objets. Vous ne pouvez pas laisser tomber un objet aussi longtemps qu'un autre objet dépend. Cela peut devenir vraiment difficile à cause des références circulaires, où deux objets (ou encore plus) dépendent les uns des autres, formant un cycle, donc il n'y a pas un seul qui peut être abandonné d'abord.

La façon de contourner cela est de briser l'une des dépendances. Une procédure par exemple qui a des dépendances avec d'autres objets peuvent être modifiés pour avoir un corps vide, après quoi il ne plus dépendre de ces autres objets, ils peuvent être déposés alors. Laissant tomber les clés étrangères est une autre façon d'éliminer les dépendances entre les tables.

Je ne sais pas de tout outil mettant en œuvre une telle suppression partielle des objets de base de données, votre cas d'utilisation est loin d'être l'OMI commune. Vous pouvez cependant jeter un oeil au code source FlameRobin qui a une certaine quantité de détection de dépendance dans le code qui est utilisé pour créer des scripts ou DDL instructions de modification pour les objets de base de données. Armés de cette information, vous pouvez écrire votre propre outil pour le faire.

S'il est une chose une seule fois, il peut être suffisant pour le faire manuellement, bien que. Utilisez un outil de gestion Firebird de votre choix pour cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top