Firebird 1.5データベースにすべてのトリガーをドロップする方法
-
02-10-2019 - |
質問
デバッグのために、既存のFirebird 1.5データベースのテーブルを誰かに送信する必要があります。
DB全体を送信する代わりに、このテーブルだけでDBだけを送信したいと思います。トリガーも制約もありません。データを別のDBにコピーすることはできません。なぜなら、私たちが確認したいのはそれだけなのか、なぜこのテーブルにトラブルが与えられるのか。
すべてのトリガー、すべての制約、1つのテーブルを除くすべてのテーブルをドロップする方法があるかどうか疑問に思っています(システムテーブルなどで巧妙なトリックを使用して)?
解決
GUIツール(個人的にはibexpertを好む)を使用して、次のコマンドを実行します。
select 'DROP TRIGGER ' || rdb$trigger_name || ';' from rdb$triggers
where (rdb$system_flag = 0 or rdb$system_flag is null)
結果の結果をクリップボードにコピーし、貼り付けてスクリプトエグゼクティブウィンドウ内で実行します。
他のヒント
データベースのバックアップがFirebird2.1に切り替えることができる場合、いくつかの切り替えがあります GBAKとISQL.
一部のFirebirdコマンドラインツールには、データベーストリガーの自動発火を抑制するための新しいスイッチが付属しています。
gbak -nodbtriggers isql -nodbtriggers nbackup -T
これらのスイッチは、データベースの所有者とSysdbaによってのみ使用できます。
システムテーブルから直接削除することで、すべてのトリガーをドロップできます。
delete from rdb$triggers
where (rdb$system_flag = 0 or rdb$system_flag is null);
通常の使用方法に注意してください drop trigger
確かに望ましいですが、それを行うことができます。
DDLステートメントを実行することで制約をドロップすることもできますが、制約を列挙してSQLスクリプトにドロップするには、必要です execute block
Firebird 1.5にはない機能。
他のデータベースオブジェクトを削除するための同様のステートメントがありますが、実際にこれらを正常に実行することは、オブジェクト間の依存関係のためにはるかに難しい場合があります。別のオブジェクトがそれに依存している限り、オブジェクトをドロップすることはできません。これは、2つの(またはさらに多くの)オブジェクトが互いに依存してサイクルを形成する循環参照のために本当に注意が必要になる可能性があるため、最初にドロップされる可能性のあるものは1つもありません。
これを回避する方法は、依存関係の1つを破ることです。たとえば、他のオブジェクトへの依存関係を持つ手順は、空のボディを持つように変更できます。その後、他のオブジェクトに依存しなくなるため、その後ドロップされる可能性があります。外部キーをドロップすることは、テーブル間の依存関係を排除するもう1つの方法です。
データベースオブジェクトの部分的な削除を実装するツールはわかりませんが、ユースケースはIMOとはかけ離れています。ただし、を確認できます フラメロビンソースコード これには、データベースオブジェクトのDDLスクリプトまたは変更ステートメントを作成するために使用されるコードに一定量の依存関係検出があります。その情報を武装して、あなたはそれをするためにあなた自身のツールを書くことができます。
ただし、一度にこれを手動で行うには十分かもしれません。そのために選択したFirebird管理ツールを使用してください。