2013-12-09 3 views
1

У меня есть ситуации, когда я должен:Откат DML после DDL терпит неудачу

  1. Отключить FK ограничения для некоторых таблиц,
  2. Изменение значений полей для первичных ключей, на которые ссылаются внешние ключи (которые также обновлены до матч),
  3. повторное включение FK ограничений с шага 1.

проблема состоит в том, что повторное включение ограничения в пункте 3 может потерпеть неудачу, если меняется от шага 2 сделано для полей первичного ключа не consi стент с полями, на которые ссылаются внешние ключи. Я хотел бы уловить этот случай и отменить изменения, сделанные на шаге 2. Насколько мне известно, запуск DDL-оператора, такого как включение ограничения, сначала выдаст фиксацию, после чего я не могу отменить изменения, сделанные на шаге 2.

Есть ли способ достичь этого в одном автономном скрипте? Процесс должен либо полностью пройти, либо откатить, как будто ничего не произошло. Или есть альтернатива транзакциям, которые могут вернуться к предыдущему состоянию, не делая резервное копирование/восстановление всей базы данных?

+2

Это однопользовательский процесс? Если это так, вы можете использовать Flashback Table для возврата к предыдущей версии только соответствующих таблиц. –

ответ

2

То, как я работаю, это заблокировать каждую таблицу перед выполнением обновления, запустить запросы, чтобы вручную проверять любые нарушения, прежде чем снова включить ограничение. Если есть какие-либо нарушения, вы можете отменить обновление, иначе повторное включение ограничения сделает фиксацию и освободит блокировку таблицы.

0

Вы можете попробовать выполнить DDL в автономной транзакции. Таким образом, он будет изолирован от вашего DML. Если DDL выходит из строя, вы все равно можете отменить DML. Однако, если DDL должен «видеть» незафиксированные изменения DML, вы застряли. Я не думаю, что ты сможешь добраться туда, куда хочешь.

+0

Я отключил ограничения FK, чтобы я мог изменить PKs/FKs на шаге 2, поэтому я не думаю, что могу отделить DDL от DML. –

+0

Да, это проблема. Ответ Джеффри выше имеет смысл? –

Смежные вопросы