Команда отката не работает - Oracle - PullRequest
0 голосов
/ 20 января 2012

Я опустил стол и попытался откатить, но безрезультатно. Будет ли это когда-нибудь работать так или я здесь играю неправильно?

Из большинства комментариев ясно, что операторы DDL не могут быть отменены с помощью отката, а только с помощью FLASHBACK.

Я пытался удалить УДАЛЕНИЕ ИЗ СТУДЕНТА;

Это все еще не может быть отменено:

Мой порядок исполнения был

  • ВСТАВИТЬ

  • УДАЛИТЬ ОТ,

  • ROLLBACK.

Ответы [ 8 ]

12 голосов
/ 20 января 2012

Я не верю, что откат отменит изменения схемы.

4 голосов
/ 20 января 2012

ROLLBACK без квалификатора точки сохранения откатит всю текущую транзакцию.

Для операторов DDL текущая транзакция для отката отсутствует.Оператор DDL неявно генерирует COMMIT до его начала и после его завершения.Таким образом, если вы выдаете ROLLBACK после DROP, в текущей транзакции не было выполнено никакой работы, поэтому откат не выполняется.

Для операторов DML вы откатите всю текущую транзакцию,Если вы выполните

  • INSERT
  • DELETE
  • ROLLBACK

, ваша транзакция начинается, когда вы выполняете операцию 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
4 голосов
/ 20 января 2012

Откат не отменяет изменения схемы, но чтобы отменить операции удаления таблицы, вы можете проверить:

http://docs.oracle.com/cd/B19306_01/backup.102/b14192/flashptr004.htm

3 голосов
/ 20 января 2012

Из документации :

База данных Oracle неявно фиксирует текущую транзакцию до и после каждого оператора DDL.

Это означает, что вы не можете ROLLBACK оператор DDL (то есть изменение схемы).

1 голос
/ 20 января 2012

Откат никогда не отменяет команды определения данных, такие как удаление таблицы, изменение таблицы и т. Д.

0 голосов
/ 21 января 2012

Откат:

Отменить все ожидающие изменения, используя инструкцию 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

После коммита мы не можем откатиться.

0 голосов
/ 21 января 2012

Для отката изменений ddl вам необходимо использовать Flashback.

0 голосов
/ 20 января 2012

Удаление таблицы приводит к изменению структуры базы данных (при использовании операторов DDL , таких как CREATE, DROP, ...).

COMMIT и ROLLBACK работают только данные , которые обмениваются с базой данных с помощью операторов DML (например, INSERT, UPDATE, ...).

Так что нет, это никогда не будет работать так.

...