【问题标题】:Wrap an Oracle schema update in a transaction在事务中包装 Oracle 模式更新
【发布时间】:2010-09-08 17:27:33
【问题描述】:

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

任何方法可以关闭这个隐式提交吗?

【问题讨论】:

  • Oracle 在每个 DDL 语句之前和之后都会发出一个 COMMIT。

标签: oracle transactions ddl


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2015-11-14
    相关资源
    最近更新 更多