爲了調試目的,我需要向某人發送一個現有Firebird 1.5數據庫的表。如何刪除Firebird 1.5數據庫中的所有觸發器
而不是發送整個數據庫,我想只發送數據庫與這張表 - 沒有觸發器,沒有限制。我無法將數據複製到另一個數據庫,因爲這只是我們想要檢查的原因 - 爲什麼這一張表會給出麻煩。
我只是想知道是否有一種方法可以刪除所有觸發器,所有約束和除了一個表之外的其他所有表格(在系統表中使用某些聰明的技巧)?
爲了調試目的,我需要向某人發送一個現有Firebird 1.5數據庫的表。如何刪除Firebird 1.5數據庫中的所有觸發器
而不是發送整個數據庫,我想只發送數據庫與這張表 - 沒有觸發器,沒有限制。我無法將數據複製到另一個數據庫,因爲這只是我們想要檢查的原因 - 爲什麼這一張表會給出麻煩。
我只是想知道是否有一種方法可以刪除所有觸發器,所有約束和除了一個表之外的其他所有表格(在系統表中使用某些聰明的技巧)?
使用GUI工具(我個人比較喜歡IBExpert)執行以下命令:
select 'DROP TRIGGER ' || rdb$trigger_name || ';' from rdb$triggers
where (rdb$system_flag = 0 or rdb$system_flag is null)
複製導致到剪貼板,然後粘貼和腳本執行 窗口中執行。
如果您的數據庫備份可以切換到Firebird 2.1,則在gbak and isql中有一些開關。
一些火鳥命令行工具已經 已與新交換機提供給 抑制 數據庫的自動點火觸發:
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腳本中,您需要Firebird 1.5不具有的execute block
功能。
有類似的語句可以刪除其他數據庫對象,但由於對象之間的依賴關係,實際成功運行這些對象可能會更加困難。只要另一個對象依賴於它,就不能刪除任何對象。由於循環引用,這可能變得非常棘手,其中兩個(或更多)對象相互依賴,形成一個循環,因此沒有一個可能首先被刪除。
解決方法是打破其中一個依賴關係。例如,對其他對象具有依賴關係的過程可以被更改爲具有空主體,之後它不再依賴於其他對象,因此可能會丟棄它們。刪除外鍵是消除表之間依賴關係的另一種方法。
我不知道任何工具實現這樣的數據庫對象的部分刪除,您的用例是IMO遠非常見。然而,您可以查看FlameRobin source code,該代碼在用於爲數據庫對象創建DDL腳本或修改語句的代碼中具有一定程度的依賴關係檢測。有了這些信息,你就可以編寫自己的工具來做到這一點。
但是,如果這是一次性事情,那麼手動完成此操作可能就足夠了。使用你選擇的任何Firebird管理工具。
K.:你有更多這些'select ..'語句嗎?選擇各種限制f.i. ? – Edelcom 2010-09-06 07:58:06