Таблица Oracle с резервными данными

#sql #oracle #plsql

Вопрос:

У меня есть посылка, которую я называю так:

 BEGIN
    package.sp1();
    package.sp2();
END;
 

Во время этого выполнения таблица обновляется в процедурах sp1 и sp2. Однако мне нужно сохранить копию этой таблицы в том виде, в каком она была изначально, на случай, если что-то пойдет не так и мне нужно будет восстановить предыдущие данные. Данные будут копироваться только при первом выполнении каждого дня. Затем, на следующий день, скопированные данные будут использоваться в качестве отправной точки для обновления в процедурах sp1 и sp2.

Как я могу сделать это в другой процедуре?

Это то, что я хочу сделать в псевдокоде:

 BEGIN
    -- Fetch the data copied in yesterday's first execution
        package.sp1(); -- Updates the table
        package.sp2(); -- Also updates the table
    -- Store the updated data if this is the first execution of the day
END;
 

Комментарии:

1. В какой момент и как вы определяете, что «что-то пошло не так»? Чего вы ожидаете «пойти не так»? Чтобы сделать то, о чем вы просите, вам, очевидно, нужен какой-то метод определения того, является ли это первым исполнением за день. Но я подозреваю, что вся ваша концепция этой «резервной таблицы» и заполнение ее только при первом выполнении в течение дня в корне ошибочны.

2. Вместо того, чтобы сохранять копию таблицы, вы заглянули в SAVE POINTS нее ? docs.oracle.com/cd/B19306_01/appdev.102/b14261/…

3. @EdStevens Я открыт для новых идей о том, как выполнить мои требования.

4. » Я открыт для новых идей о том, как выполнить мои требования» Ну, сначала нам нужно знать фактические требования … бизнес -требования. Нам нужно было бы знать, откуда берутся данные. Нам нужно знать, почему вы можете выполнять процедуру несколько раз в день, но хотите использовать только «начало дня» в качестве точки восстановления. Нам нужно было бы знать, что именно вы ожидаете, что пойдет не так. Возможно, нам следует решить основную проблему там, а не эту заранее продуманную идею резервного копирования/восстановления.

5. Бизнес-требования: для пакета существует только производственная среда. Первое выполнение дня-это то, в котором хранятся «хорошие данные» в таблице. После этого мы вручную сохраняем копию «хороших данных» в другой таблице и запускаем тесты/вносим изменения. Когда мы закончим с ними, мы восстановим копию с «хорошими данными» в таблице.

Ответ №1:

Вы можете оставить его, возвращаясь к данным за предыдущий день, к механизму запроса флэш-памяти Oracle, при условии, что версия вашей базы данных составляет 10g , а также выполняются некоторые условия, такие как

  1. значение параметра undo_retention должно быть установлено не менее 86 400, что выражается в секундах и равно одному дневному периоду.
  2. табличное пространство отмены должно быть с включенным автоматическим расширением, или гарантия сохранения включена для табличного пространства отмены фиксированного размера, но с большим объемом.

Затем используйте этот запрос ;

 DELETE tab;
INSERT INTO tab
SELECT *
  FROM tab
    AS OF TIMESTAMP TRUNC(SYSTIMESTAMP);
COMMIT;
 

всякий раз, когда что-то шло не так и требовалось вернуться к нужному моменту времени для получения данных.

Комментарии:

1. Спасибо! Я не понимаю, хотя часть «УДАЛИТЬ вкладку». Если я удалю его, как я вставлю значения?

2. добро пожаловать @banana_99 Сегмент отмены Oracle хранит ваши прошлые данные, прошлые версии остаются в сегменте до тех пор, пока не будут выполнены минимальные требования, и со временем они исчезнут в зависимости от значения параметра undo_retention и стиля расширения сегмента, и вы уже хотите вернуться к моменту времени и должны удалить все существующие данные, чтобы предотвратить повторную вставку. Вы могли бы сослаться .

3. Использование запроса Oracle Flashback также может помочь.

4. Спасибо. Будет ли работать запрос Oracle Flashback, если таблица будет удалена и воссоздана заново?

5. добро пожаловать @banana_99 , нет, это невозможно, так как это DDL, но не DML, мы не можем вернуться к моменту времени до выпуска DDL, даже если это добавление нового столбца в существующую таблицу. Затем вы можете просмотреть таблицу флэш-памяти, чтобы восстановить уже удаленную таблицу. FLASHBACK TABLE tab TO BEFORE DROP; может быть выдан в качестве примера синтаксиса.