2010-08-30 133 views
2

爲了調試目的,我需要向某人發送一個現有Firebird 1.5數據庫的表。如何刪除Firebird 1.5數據庫中的所有觸發器

而不是發送整個數據庫,我想只發送數據庫與這張表 - 沒有觸發器,沒有限制。我無法將數據複製到另一個數據庫,因爲這只是我們想要檢查的原因 - 爲什麼這一張表會給出麻煩。

我只是想知道是否有一種方法可以刪除所有觸發器,所有約束和除了一個表之外的其他所有表格(在系統表中使用某些聰明的技巧)?

回答

3

使用GUI工具(我個人比較喜歡IBExpert)執行以下命令:

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

複製導致到剪貼板,然後粘貼和腳本執行 窗口中執行。

+0

K.:你有更多這些'select ..'語句嗎?選擇各種限制f.i. ? – Edelcom 2010-09-06 07:58:06

3

如果您的數據庫備份可以切換到Firebird 2.1,則在gbak and isql中有一些開關。

一些火鳥命令行工具已經 已與新交換機提供給 抑制 數據庫的自動點火觸發:

gbak -nodbtriggers 
isql -nodbtriggers 
nbackup -T 

這些交換機可以僅由 數據庫所有者和SYSDBA使用。

3

您可以通過從系統表直接刪除它們,像這樣放棄所有觸發器:

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

注意,使用drop trigger的正常方式肯定是最好的,但它可以做到的。

您還可以通過執行DDL語句來刪除約束,但要枚舉約束並將它們放入SQL腳本中,您需要Firebird 1.5不具有的execute block功能。

有類似的語句可以刪除其他數據庫對象,但由於對象之間的依賴關係,實際成功運行這些對象可能會更加困難。只要另一個對象依賴於它,就不能刪除任何對象。由於循環引用,這可能變得非常棘手,其中兩個(或更多)對象相互依賴,形成一個循環,因此沒有一個可能首先被刪除。

解決方法是打破其中一個依賴關係。例如,對其他對象具有依賴關係的過程可以被更改爲具有空主體,之後它不再依賴於其他對象,因此可能會丟棄它們。刪除外鍵是消除表之間依賴關係的另一種方法。

我不知道任何工具實現這樣的數據庫對象的部分刪除,您的用例是IMO遠非常見。然而,您可以查看FlameRobin source code,該代碼在用於爲數據庫對象創建DDL腳本或修改語句的代碼中具有一定程度的依賴關係檢測。有了這些信息,你就可以編寫自己的工具來做到這一點。

但是,如果這是一次性事情,那麼手動完成此操作可能就足夠了。使用你選擇的任何Firebird管理工具。

相關問題