2010-08-30 34 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管理工具。

相关问题