2008-09-12 42 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上工作。