当前位置:  开发笔记 > 前端 > 正文

在事务中包装Oracle架构更新

如何解决《在事务中包装Oracle架构更新》经验,为你挑选了1个好方法。

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

http://www.orafaq.com/wiki/SQL_FAQ#What_are_the_difference_between_DDL.2C_DML_and_DCL_commands.3F

http://infolab.stanford.edu/~ullman/fcdb/oracle/or-nonstandard.html#transactions

没有办法关闭这个隐式提交?



1> Ethan Post..:

你无法关闭它.通过设计脚本以便在已经存在的情况下删除表等,可以相当容易地解决...

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

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有