出于调试目的,我需要将现有 Firebird 1.5 数据库的 1 个表发送给某人。
而不是发送整个 db ,我只想发送带有这个表的 db - 没有触发器,没有约束。我无法将数据复制到另一个数据库,因为这只是我们想要检查的 - 为什么这个表会出现问题。
我只是想知道是否有一种方法可以删除所有触发器、所有约束和除一个表之外的所有表(对系统表使用一些巧妙的技巧)?
出于调试目的,我需要将现有 Firebird 1.5 数据库的 1 个表发送给某人。
而不是发送整个 db ,我只想发送带有这个表的 db - 没有触发器,没有约束。我无法将数据复制到另一个数据库,因为这只是我们想要检查的 - 为什么这个表会出现问题。
我只是想知道是否有一种方法可以删除所有触发器、所有约束和除一个表之外的所有表(对系统表使用一些巧妙的技巧)?
如果您的数据库备份可以切换到 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 没有的功能。
删除其他数据库对象也有类似的语句,但由于对象之间的依赖关系,实际成功运行这些语句可能要困难得多。只要另一个对象依赖于它,您就不能丢弃任何对象。由于循环引用,这可能变得非常棘手,其中两个(甚至更多)对象相互依赖,形成一个循环,因此没有一个可以首先删除。
解决此问题的方法是打破其中一个依赖项。例如,可以将依赖于其他对象的过程更改为具有空主体,之后它不再依赖于那些其他对象,因此它们可能会被删除。删除外键是另一种消除表之间依赖关系的方法。
我不知道有任何工具可以实现对数据库对象的这种部分删除,您的用例在 IMO 中并不常见。但是,您可以查看FlameRobin 源代码,它在用于为数据库对象创建 DDL 脚本或修改语句的代码中具有一定数量的依赖检测。有了这些信息,您就可以编写自己的工具来执行此操作。
不过,如果这是一次性的事情,手动执行此操作可能就足够了。为此,请使用您选择的任何 Firebird 管理工具。
使用 GUI 工具(我个人更喜欢 IBExpert)执行以下命令:
select 'DROP TRIGGER ' || rdb$trigger_name || ';' from rdb$triggers
where (rdb$system_flag = 0 or rdb$system_flag is null)
将结果复制到剪贴板,然后在脚本执行窗口中粘贴和执行。