Domanda

Per gli scopi di debug ho bisogno di inviare 1 tavolo di un database Firebird 1.5 esistente a qualcuno.

Invece di inviare l'intero db, voglio inviare solo il db con appena questo tavolo - nessun trigger, vincoli. Non riesco a copiare i dati a un altro db, perché è proprio questo che vogliamo verificare -. perché questo una tabella è dato problemi

Mi chiedo solo se c'è un modo per eliminare tutti i trigger, tutti i vincoli e tutti, ma una tabella (usando qualche trucco intelligente con le tabelle di sistema o giù di lì)?

È stato utile?

Soluzione

Utilizzando lo strumento di interfaccia grafica (io personalmente preferisco IBExpert) eseguire seguente comando:

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

Copia risultato nella clipboard quindi incollare ed eseguire all'interno di script esecutivo finestra.

Altri suggerimenti

Se il backup del database può passare a Firebird 2.1 v'è qualche interruttore nella gbak e isql .

  

Alcuni strumenti della riga di comando di Firebird hanno   stato dotato di nuovi commuta   sopprimere la cottura automatica di   trigger del database:

gbak -nodbtriggers
isql -nodbtriggers
nbackup -T
     

Questi parametri possono essere utilizzati solo dal   proprietario del database e SYSDBA.

Si può cadere tutti i trigger cancellandoli direttamente dalla tabella di sistema, in questo modo:

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

Si noti che il modo normale di usare drop trigger è certamente preferibile, ma può essere fatto.

Si può anche cadere i vincoli eseguendo istruzioni DDL, ma per enumerare i vincoli e rilasciarli in uno script SQL si avrebbe bisogno la funzionalità execute block che Firebird 1.5 non ha.

Ci sono dichiarazioni simili per eliminare altri oggetti di database, ma effettivamente in esecuzione questi con successo possono essere molto più difficile a causa delle dipendenze tra gli oggetti. Non è possibile eliminare qualsiasi oggetto fintanto che un altro oggetto dipende da esso. Questo può diventare causa veramente difficile da riferimenti circolari, in cui due (o anche più) oggetti dipendono l'uno dall'altro, formano un ciclo, quindi non v'è una sola che può essere eliminato prima.

Il modo per aggirare questo è quello di rompere una delle dipendenze. Una procedura per esempio con dipendenze ad altri oggetti può essere modificata per avere un corpo vuoto, dopo di che essa non dipende da quegli altri oggetti, in modo che possano essere eliminate poi. Lasciando cadere le chiavi esterne è un altro modo di eliminare le dipendenze tra le tabelle.

Non so di qualsiasi strumento di attuazione della stessa parziale eliminazione di oggetti di database, il vostro caso d'uso è IMO tutt'altro che comune. Si potrebbe tuttavia avere uno sguardo alla FlameRobin codice sorgente che ha una certa quantità di rilevamento delle dipendenze nel codice che viene utilizzato per creare script DDL o istruzioni di modifica per gli oggetti di database. Armati di queste informazioni si può scrivere il proprio strumento per farlo.

Se è una cosa di una volta, può essere sufficiente per fare questa operazione manualmente, però. Utilizzare qualsiasi strumento di gestione Firebird di vostra scelta per questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top