2008-09-12 15 views
4

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

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没有预期的效果。甲骨文似乎做每个DDL语句后隐式提交:

关闭这个隐式提交的方式?

+1

Oracle在每个DDL语句之前以及之后发出一个COMMIT。 – APC 2009-09-12 16:42:00

回答

6

您无法关闭此功能。通过设计你的脚本,以便在他们已经存在的事件中丢弃表格时,相当容易解决...

你可以看看使用FLASHBACK数据库,我相信你可以在模式/对象级别执行此操作,但检查文档确认。你需要在10G上工作。