4

データベーススキーマを定期的に更新するプログラムがあります。場合によっては、DDLステートメントの1つが失敗することがあります。失敗した場合は、すべての変更をロールバックしたいと思います。次のようなトランザクションで更新をラップします。

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;

実行中に、ステートメントの1つが失敗した場合、COMMITの代わりにROLLBACKを実行します。これはSQLServerではうまく機能しますが、Oracleでは望ましい効果がありません。Oracleは、各DDLステートメントの後に暗黙のCOMMITを実行するようです。

この暗黙のコミットをオフにする方法はありますか?

4

1 に答える 1

6

これをオフにすることはできません。テーブルが既に存在する場合などにテーブルを削除するようにスクリプトを設計することで、かなり簡単に回避できます...

FLASHBACKデータベースを使用して見ることができます.スキーマ/オブジェクトレベルでこれを行うことができると思いますが、ドキュメントをチェックして確認してください. それが機能するには、10Gに接続する必要があります。

于 2008-09-12T15:38:10.160 に答える