我有一个定期更新其数据库架构的程序。有时,其中一个DDL语句可能会失败,如果有,我想回滚所有更改。我将更新包装在如下的事务中:
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:
是否有任何方式来关闭此隐式提交?
答案 0 :(得分:6)
你无法关闭它。通过设计脚本以便在已经存在的情况下删除表等,可以相当容易地解决...
您可以查看使用FLASHBACK数据库,我相信您可以在架构/对象级别执行此操作,但请检查文档以确认这一点。你需要在10G才能工作。