2

デバッグの目的で、既存のFirebird1.5データベースの1つのテーブルを誰かに送信する必要があります。

db全体を送信する代わりに、このテーブルだけを含むdbだけを送信したいと思います。トリガーも制約もありません。データを別のデータベースにコピーすることはできません。これは、チェックしたいだけなので、この1つのテーブルに問題が発生する理由です。

すべてのトリガー、すべての制約、および1つを除くすべてのテーブルを削除する方法があるかどうか疑問に思っています(システムテーブルなどで巧妙なトリックを使用して)?

4

3 に答える 3

3

データベースのバックアップをFirebird2.1に切り替えることができる場合は、gbakとisqlにいくつかの切り替えがあります。

一部のFirebirdコマンドラインツールには、データベーストリガーの自動起動を抑制するための新しいスイッチが付属しています。

gbak -nodbtriggers
isql -nodbtriggers
nbackup -T

これらのスイッチは、データベース所有者とSYSDBAのみが使用できます。

于 2010-08-30T17:08:33.563 に答える
3

次のように、システムテーブルからトリガーを直接削除することで、すべてのトリガーを削除できます。

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

通常の使用方法drop triggerが確かに望ましいことに注意してください、しかしそれはすることができます。

DDLステートメントを実行して制約を削除することもできますが、制約を列挙してSQLスクリプトに削除するには、execute blockFirebird1.5にはない機能が必要になります。

他のデータベースオブジェクトを削除するための同様のステートメントがありますが、オブジェクト間の依存関係のため、実際にこれらを正常に実行することははるかに難しい場合があります。別のオブジェクトがそれに依存している限り、オブジェクトをドロップすることはできません。これは、2つ(またはそれ以上)のオブジェクトが相互に依存してサイクルを形成する循環参照のために非常に扱いにくい場合があります。そのため、最初にドロップされる可能性のあるオブジェクトは1つではありません。

これを回避する方法は、依存関係の1つを壊すことです。たとえば、他のオブジェクトに依存しているプロシージャは、本体が空になるように変更できます。その後、他のオブジェクトに依存しなくなるため、削除される可能性があります。外部キーを削除することは、テーブル間の依存関係を排除するもう1つの方法です。

データベースオブジェクトのそのような部分的な削除を実装するツールを私は知りません、あなたのユースケースは一般的とはほど遠いIMOです。ただし、データベースオブジェクトのDDLスクリプトまたは変更ステートメントを作成するために使用されるコードにある程度の依存関係が検出されているFlameRobinソースコードを見ることができます。その情報で武装して、あなたはそれをするためにあなた自身のツールを書くことができました。

ただし、これが1回限りの場合は、手動で行うだけで十分な場合があります。そのために、任意のFirebird管理ツールを使用してください。

于 2010-09-02T07:25:19.910 に答える
3

GUIツール(私は個人的にIBExpertを好みます)を使用して、次のコマンドを実行します。

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

結果をクリップボードにコピーし、スクリプトエグゼクティブウィンドウ内に貼り付けて実行します。

于 2010-09-05T07:40:53.490 に答える