Печеньки от Oracle. Логическое удаление записи

Запись нужно удалить, но данные терять не хочется - что делать?

Нужно ввести в таблицу дополнительную колонку-выключатель, например так:

alter table my_tab
add is_active number
default 1
;

Обычно мы используем не менее двух схем (пользователей) базы данных:

  • схема-владелец;
  • схема-публикация.

Односхемное решение, когда среднему слою (PHP, APEX, иные среды Web программирования) дается доступ прямо к таблицам, мы не рассматриваем. Так поступать просто нельзя.

Соответственно, мы оборачиваем таблицы схемы-владельца представлениями, на которые выдаем схеме-публикации необходимые права:

create view my_vi
as
select column_1, column_2 ...
from my_tab
;
grant select, insert, update on my_vi to <имя_схемы_публикации>
;

После добавления в исходную таблицу my_tab поля-выключателя is_active нам достаточно добавить в экранирующее представление условие проверки состояния этого выключателя:

create view my_vi
as
select column_1, column_2 ...
from my_tab
where is_active = 1
;

Представление с фильтрацией логически удаленных записей
Представление с фильтрацией логически удаленных записей

После этого в процедуре/процессе удаления записи физический delete меняется на update... set is_active = 0. Данные в таблице сохранены, но никуда в выборки они не пойдут. При необходимости их можно будет восстановить.

Это очень простое решение. В одной из последующих заметок я планирую рассказать о гораздо более изощренном применении условия where в экранирующем представлении.