Oracle が DML のコミットを提供したのに、DDL のコミットを提供しなかったのはなぜですか?
DDL ステートメントを発行すると、基本的に Oracle データ ディクショナリに対してトランザクションが開始されます。このトランザクションは、オーバーヘッドを排除するために、できるだけ短く、できるだけ早く有効にする必要があります。このため、DDL ステートメントは、DDL ステートメントの前と、ステートメントの直後 (または何か問題が発生した場合はロールバック) の二重コミットを行います。この動作により、Oracle の DDL はトランザクション DDL ではなくなり、明示的にコミットまたはロールバックできなくなります。それはまさにその通りです。
そうは言っても、テーブルを削除した場合、10g 以降では、flashback table
テクノロジを使用して 1 つのステートメントでテーブルを取り戻すことができますdrop table
。これは、ステートメントを発行した後、Oracle はテーブルを削除せず、代わりにごみ箱に入れるためです。
flashback table <<table_name>> to before drop
残念ながら、フラッシュバック テーブルを使用してテーブルの削除された列を復元することはできません。これは、削除された列がごみ箱に入れられないためです。データベース全体または単一のテーブルスペースのポイント イン タイム リカバリを実行するか、論理バックアップ (*.dmp ファイル) がある場合は、imp
またはimpdp
ユーティリティを使用してそこからテーブルを復元する必要があります。