4

我有一个定期更新其数据库模式的程序。有时,其中一个 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:

什么办法可以关闭这个隐式提交?

4

1 回答 1

6

您不能将其关闭。通过设计脚本以在它们已经存在的情况下删除表等,这很容易解决......

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

于 2008-09-12T15:38:10.160 回答