Как ни странно, но, практически у каждой БД есть пользователи :), а они постоянно пытаются сделать какие-нибудь пакости, которые не предусмотришь никакой программой.
Чтобы успешно отбиться от пользователей, утверждающих, что у тебя программа глючит, и от начальства, к которому пользователи тут же побегут жаловаться, нужно применять архивирование всех изменяемых и удаляемых строк критичных таблиц.
Предлагаемый вариант архивирования позволяет:
Создаётся пользователь ARCHIV, в схеме которого (и от его имени!) размещаются архивные таблицы и процедуры для занесения архивируемых строк. В основной схеме размещаются триггеры на нужные таблицы, срабатывающие на изменение и удаление строк. В триггере находится вызов процедуры архивирования, которой передаются, в качестве параметров, все старые значения полей удаляемой или изменяемой строки.
Почему так сложно? Потому что конечный пользователь, в этом случае, не может увидеть и изменить заархивированные записи. Такой подход сработает в случае, если
Последовательность действий:
CREATE USER ARCHIV IDENTIFIED BY ARCHIV;
GRANT CREATE ANY INDEX TO "ARCHIV";
GRANT CREATE ANY PROCEDURE TO "ARCHIV";
GRANT CREATE SESSION TO "ARCHIV";
GRANT CREATE TABLE TO "ARCHIV";
DECLARE
CURSOR c_tables IS
SELECT table_name FROM user_tables
WHERE table_name IN ('TABLE1','TABLE2','TABLE3','TABLE4')
ORDER BY 1;
BEGIN
FOR c_tab IN c_tables LOOP
CR_ARC_TABLES(c_tab.table_name);
END loop;
end;
DECLARE CURSOR c_tables IS SELECT table_name FROM user_tables WHERE table_name IN ('TABLE1','TABLE2','TABLE3','TABLE4') ORDER BY 1; BEGIN FOR c_tab IN c_tables LOOP CR_TRIGGER(c_tab.table_name); END loop; end;
Всё, любуйтесь результатом.
В случае, если отслеживаемые таблицы изменяются очень часто в ходе работы в стандартном режиме, нужно подправить триггеры, ввести в них соответствующие условия срабатывания или указать только критичные поля таблицы для срабатывания триггера. Иногда приходится разделять триггер на 2 части - отдельно для update и delete.
Если воспользоваться ежедневным сбором статистики на таблицы, то легко определять в каких архивных таблицах появились новые записи за предидущий день.
Чуть позже, как только придумаю, выложу удобный вариант просмотра результатов архивирования.