在事务中包装Oracle模式更新

在事务中包装Oracle模式更新

Wrap an Oracle schema update in a transaction

我有一个程序会定期更新其数据库架构。 有时,其中一个DDL语句可能会失败,如果失败了,我想回滚所有更改。 我将更新包装在这样的事务中:

1
2
3
4
5
6
7
8
BEGIN TRAN;

CREATE TABLE A (PKey int NOT NULL IDENTITY, NewFieldKey int NULL, CONSTRAINT PK_A PRIMARY KEY (PKey));
CREATE INDEX A_2 ON A (NewFieldKey);
CREATE TABLE B (PKey int NOT NULL IDENTITY, CONSTRAINT PK_B PRIMARY KEY (PKey));
ALTER TABLE A ADD CONSTRAINT FK_B_A FOREIGN KEY (NewFieldKey) REFERENCES B (PKey);

COMMIT TRAN;

在执行过程中,如果其中一条语句失败,我将执行ROLLBACK而不是COMMIT。 这在SQL Server上效果很好,但对Oracle效果不理想。 Oracle似乎在每个DDL语句之后执行一个隐式COMMIT:

  • http://www.orafaq.com/wiki/SQL_FAQ#What_are_the_difference_between_DDL.2C_DML_and_DCL_commands.3F
  • http://infolab.stanford.edu/~ullman/fcdb/oracle/or-nonstandard.html#transactions

有什么办法可以关闭此隐式提交吗?


您无法关闭此功能。 通过设计脚本来在表已经存在的情况下删除表,可以轻松解决该问题。

您可以查看使用FLASHBACK数据库,我相信您可以在模式/对象级别执行此操作,但是请检查文档以确认这一点。 您需要使用10G才能正常工作。


推荐阅读