代码之家  ›  专栏  ›  技术社区  ›  Edelcom

如何在Firebird 1.5数据库中删除所有触发器

  •  2
  • Edelcom  · 技术社区  · 15 年前

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

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

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

    3 回复  |  直到 11 年前
        1
  •  3
  •   Andrej KirejeÅ­    15 年前

    使用GUI工具(我个人更喜欢ibexpert)执行以下命令:

    select 'DROP TRIGGER ' || rdb$trigger_name || ';' from rdb$triggers
      where (rdb$system_flag = 0 or rdb$system_flag is null)
    

    将结果复制到剪贴板,然后粘贴并在脚本执行程序中执行 窗口。

        2
  •  3
  •   Hugues Van Landeghem    15 年前

    如果您的数据库备份可以切换到Firebird 2.1,则会有一些切换。 gbak and isql .

    一些Firebird命令行工具 提供了新的开关 禁止自动触发 数据库触发器:

    gbak -nodbtriggers
    isql -nodbtriggers
    nbackup -T
    

    这些开关只能由 数据库所有者和sysdba。

        3
  •  3
  •   mghie    15 年前

    您可以直接从系统表中删除所有触发器,如下所示:

    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 source code 它在用于为数据库对象创建DDL脚本或修改语句的代码中具有一定量的依赖性检测。有了这些信息,你就可以编写自己的工具来完成它。

    不过,如果只是一次性的话,手动操作就足够了。为此,请使用您选择的任何火鸟管理工具。

    推荐文章