在事务中修改表结构?

Mar*_*tin 4 schema oracle flashback alter-table

在 Oracle(也可能在其他地方)中,执行 ALTER TABLE 语句将对当前事务进行隐式提交。

我们有一个工具(用 Java 编写)应该通过以下方式修改模式:

  • 添加一些列
  • 删除一些列
  • 使用新的架构布局更新描述表

编写的工具将向用户显示当前模式布局并允许他对其进行修改。(基本上是向某些表添加或删除自定义“属性”列)一旦他满意,他就可以应用他的更改。

请注意:基本架构布局以及您需要通过 ALTER TABLE 更改某些内容这一事实是由标准预定义的,我们无法更改,因为其他工具将不再起作用。

现在的问题是我们不能在单个事务中运行这些更改,因为 AFAIK,不可能在一个事务中执行多个 ALTER TABLE 语句。

如果在应用更改时出现问题,我们有哪些选项可以“回滚”到初始状态?

注意:这里有人提出了 RESTORE POINT + FLASHBACK——从这个(Java)工具调用它是个好主意吗?(在一些应该使用该工具的站点上,我们没有完全控制数据库实例。)

注意:Oracle 10g2 及以上

Chr*_*xon 5

由于 DDL 隐式提交,“回滚”更改的唯一方法是构造反向操作并应用它来还原更改,如 a_horse_with_no_name 所述。

然而,构建这样的回滚并不总是那么简单。如果数据可以在类型修改 (varchar2(10) -> varchar2(50), number -> varchar2) 和回滚之间写入表,那么您还必须检查新数据在恢复到原始类型(或执行一些转换)。请注意,删除大表上的列可能需要一些时间并生成大量重做。

您还必须警惕由于这些更改而导致数据库和其他应用程序依赖项上的任何存储过程无效。

在这种情况下,闪回选项对您没有帮助。一旦对表进行了 DDL 更改,就无法使用闪回将其恢复到以前的状态。尝试这样做会给你错误:

ORA-01466: 无法读取数据 - 表定义已更改

闪回您的完整数据库将是矫枉过正,而且从 Java 应用程序也不可能 - 您需要关闭然后挂载数据库才能完成此操作。

这一切都提出了您的工具用途的问题。如果您只需要一个 GUI 供人们编辑表,那么 Oracle SQL Data Modeler 之类的工具可以执行此操作并为您生成 DDL 脚本。然后可以验证、测试这些,构建适当的回滚并将其应用于数据库。修改(生产)数据库的结构应该小心并经过测试以确保所有更改都有效!