#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 , а также выполняются некоторые условия, такие как
- значение параметра undo_retention должно быть установлено не менее 86 400, что выражается в секундах и равно одному дневному периоду.
- табличное пространство отмены должно быть с включенным автоматическим расширением, или гарантия сохранения включена для табличного пространства отмены фиксированного размера, но с большим объемом.
Затем используйте этот запрос ;
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;
может быть выдан в качестве примера синтаксиса.