私はテーブルを落とし、ロールバックしようとしましたが、役に立たなかった。このように機能するのでしょうか、それともここで間違ってプレイするのでしょうか?
ほとんどのコメントから、DDLステートメントはロールバックでは元に戻せず、FLASHBACKでのみ元に戻すことができることは明らかです。
DELETEFROMSTUDENTを元に戻してみました。
それでも元に戻すことはできません:
私の処刑順序は
入れる、
から削除、
ロールバック。
ロールバックによってスキーマの変更が取り消されるとは思わない。
ROLLBACK
セーブポイント修飾子がないと、現在のトランザクション全体がロールバックされます。
DDLステートメントの場合、ロールバックする現在のトランザクションはありません。DDLステートメントCOMMIT
は、ステートメントの開始前と完了後に暗黙的にaを生成します。したがって、ROLLBACK
次のを発行した場合DROP
、現在のトランザクションでは作業が行われていないため、ロールバックするものはありません。
DMLステートメントの場合、現在のトランザクション全体をロールバックします。もし、するなら
操作を実行すると、トランザクションが開始されますINSERT
。したがって、を発行すると、とのROLLBACK
両方がロールバックされるため、テーブルにデータがない状態に戻ります(データがない状態で開始したと仮定します)。その後の場合、次のトランザクションはで始まり、操作をロールバックするだけです。または、の後にセーブポイントを宣言して、セーブポイントにロールバックすることもできます。INSERT
DELETE
COMMIT
INSERT
DELETE
ROLLBACK
DELETE
INSERT
SQL> create table foo( col1 number );
Table created.
SQL> insert into foo values( 1 );
1 row created.
SQL> savepoint after_insert;
Savepoint created.
SQL> delete from foo;
1 row deleted.
SQL> rollback to savepoint after_insert;
Rollback complete.
SQL> select * from foo;
COL1
----------
1
ロールバックはスキーマの変更を元に戻すことはありませんが、テーブルの削除操作を元に戻すには、次を確認できます。
http://docs.oracle.com/cd/B19306_01/backup.102/b14192/flashptr004.htm
ドキュメントから:
Oracle Databaseは、各DDL文の前後に現在のトランザクションを暗黙的にコミットします。
ROLLBACK
これは、DDL ステートメント (つまり、スキーマの変更)を実行できないことを意味します。
ロールバックは、drop table alter table などのデータ定義コマンドを元に戻すことはありません。
テーブルを削除すると、データベースの構造が変更されます ( CREATE、DROP などのDDLステートメントを使用)。
COMMIT と ROLLBACK は、DMLステートメント (INSERT、UPDATE など)を使用してデータベースと交換されるデータに対してのみ機能します。
だから、いいえ、このように機能することは決してありません。
ddl の変更をロールバックするには、Flashback を使用する必要があります。
ロールバック:
ROLLBACK ステートメントを使用して、保留中のすべての変更を破棄します。ROLLBACK ステートメントの後:
例
TEST テーブルからレコードを削除しようとしているときに、誤ってテーブルを空にすることができます。誤りを訂正し、適切なステートメントを再発行して、データの変更を永続的にすることができます。
DELETE FROM test;
25,000 rows deleted.
ROLLBACK;
Rollback complete.
DELETE FROM test
WHERE id = 100;
1 row deleted.
SELECT *
FROM test
WHERE id = 100;
No rows selected.
COMMIT;
Commit complete
コミットした後は、ロールバックできません。