2012-01-20 6 views
-4

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

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

Я пробовал отмену УДАЛИТЬ ИЗ СТУДЕНТА;

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

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

  • ВСТАВИТЬ,

  • DELETE FROM,

  • ROLLBACK.

+0

http://stackoverflow.com/questions/4711447/oracle-ddl-and-transaction-rollback – NPE

+1

, пожалуйста, не засуньте решение в вопрос – Sathya

+0

@Sathya У меня нет достаточной репутации, чтобы ответить на мой собственный вопрос. Поэтому я обновился здесь, чтобы мои комментаторы знали, что вопрос разрешен, иначе им придется подождать 8 часов, и некоторые из них наверняка сожгли свое время, решив тот же вопрос. Вы должны были рассмотреть этот факт до голосования и редактирования моего ответа. Для меня я сделал правильную вещь и угадал, что! теперь, я должен написать свой ответ снова с нуля. Думаю, я должен поблагодарить вас! – kushalvm

ответ

4

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

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

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

  • ВСТАВКУ
  • УДАЛИТЬ
  • 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 
+0

Эй, у меня есть еще одна проблема относительно упавших таблиц, и я тоже ее разместил, но до сих пор не нашел решения. Вы можете видеть это. здесь ссылка [link] (http://stackoverflow.com/questions/8937093/dropped-table-not-showing-up-in-recycle-bin) – kushalvm

12

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

+3

Исправить. Операторы DDL не могут быть отброшены в Oracle –

+0

@climbage Можно ли отменить удаленные строки из таблицы? – kushalvm

+1

Только если они еще не COMMITED. – Kosi2801

0

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

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

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

1

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

3

С documentation:

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

Это означает, что вы не можете указать ROLLBACK инструкцию DDL (т. Е. Сменить схему).

+0

Я не уверен, что этот ответ полезен для конкретного вопроса, поскольку он требует больше знаний о концепциях структуры и транзакций, которые, очевидно, пока не понятны вопросу. – Kosi2801

+0

@ Kosi2801 @ ajx да! это не был подходящий ответ, но информация - helpul. – kushalvm

0

Чтобы откатить изменения DDL нужно использовать Flashback.

0

Откат:

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

'После предоставления фиксации мы можем откат. '==> Вы означает, что мы * не можем откат, а это бессмысленно, потому что транзакция уже закрыта. – Sathya