在事务中包装Oracle架构更新
我有一个定期更新数据库模式的程序。有时,其中一个DDL语句可能会失败,如果失败,我希望回滚所有更改。我将更新包装在一个事务中,如下所示:在事务中包装Oracle架构更新,oracle,transactions,ddl,Oracle,Transactions,Ddl,我有一个定期更新数据库模式的程序。有时,其中一个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
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;
在执行时,如果其中一条语句失败,我将执行回滚而不是提交。这在SQL Server上非常有效,但在Oracle上没有达到预期效果。Oracle似乎在每个DDL语句之后执行隐式提交:
有没有办法关闭此隐式提交?您不能关闭此功能。通过设计脚本,在表已经存在的情况下删除表,这样做相当容易
您可以使用FLASHBACK数据库,我相信您可以在模式/对象级别执行此操作,但请检查文档以确认这一点。您需要使用10G才能正常工作 Oracle在每个DDL语句之前和之后都会发出COMMIT。