2

出于调试目的,我需要将现有 Firebird 1.5 数据库的 1 个表发送给某人。

而不是发送整个 db ,我只想发送带有这个表的 db - 没有触发器,没有约束。我无法将数据复制到另一个数据库,因为这只是我们想要检查的 - 为什么这个表会出现问题。

我只是想知道是否有一种方法可以删除所有触发器、所有约束和除一个表之外的所有表(对系统表使用一些巧妙的技巧)?

4

3 回答 3

3

如果您的数据库备份可以切换到 Firebird 2.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 blockFirebird 1.5 没有的功能。

删除其他数据库对象也有类似的语句,但由于对象之间的依赖关系,实际成功运行这些语句可能要困难得多。只要另一个对象依赖于它,您就不能丢弃任何对象。由于循环引用,这可能变得非常棘手,其中两个(甚至更多)对象相互依赖,形成一个循环,因此没有一个可以首先删除。

解决此问题的方法是打破其中一个依赖项。例如,可以将依赖于其他对象的过程更改为具有空主体,之后它不再依赖于那些其他对象,因此它们可能会被删除。删除外键是另一种消除表之间依赖关系的方法。

我不知道有任何工具可以实现对数据库对象的这种部分删除,您的用例在 IMO 中并不常见。但是,您可以查看FlameRobin 源代码,它在用于为数据库对象创建 DDL 脚本或修改语句的代码中具有一定数量的依赖检测。有了这些信息,您就可以编写自己的工具来执行此操作。

不过,如果这是一次性的事情,手动执行此操作可能就足够了。为此,请使用您选择的任何 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 回答