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

代替发送整个数据库,我只想只用这张桌子发送DB - 没有触发器,没有约束。我无法将数据复制到另一个数据库,因为这只是我们要检查的 - 为什么这张表会带来麻烦。

我只是想知道是否有一种方法可以放下所有触发器,所有约束和所有桌子(使用系统表左右使用一些巧妙的技巧)?

有帮助吗?

解决方案

使用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和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没有的功能。

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

解决此问题的方法是打破一个依赖项。例如,可以更改对其他对象的依赖性的过程,以具有一个空的身体,之后它不再取决于其他对象,因此可以将其删除。放下外键是消除表之间依赖关系的另一种方法。

我不知道有任何实施此类数据库对象删除的工具,您的用例远非常见。但是,您可以看一下 弗拉梅宾蛋白源代码 在代码中具有一定数量的依赖关系检测,用于创建数据库对象的DDL脚本或修改语句。有了这些信息,您可以编写自己的工具来做到这一点。

但是,如果这是一件事,则可以手动执行此操作。为此使用您选择的任何火鸟管理工具。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top