Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在事务中包装Oracle架构更新_Oracle_Transactions_Ddl - Fatal编程技术网

在事务中包装Oracle架构更新

在事务中包装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

我有一个定期更新数据库模式的程序。有时,其中一个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;
在执行时,如果其中一条语句失败,我将执行回滚而不是提交。这在SQL Server上非常有效,但在Oracle上没有达到预期效果。Oracle似乎在每个DDL语句之后执行隐式提交:


有没有办法关闭此隐式提交?

您不能关闭此功能。通过设计脚本,在表已经存在的情况下删除表,这样做相当容易


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

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