Oracle Row Level Security в мультитенантном приложении / значения по умолчанию для новых записей
Задача
Модифицируйте существующее приложение, чтобы использовать мультитенантный подход. Должна быть возможность создавать арендаторов, и каждый сеанс пользователя должен ссылаться только на одного активного арендатора. Каждый клиент должен иметь возможность видеть и обновлять только свой раздел схемы базы данных.
Подход
- создайте контекст приложения Oracle, содержащий идентификатор клиента
- добавьте столбец идентификатора арендатора в любую таблицу, которая должна быть scoped
- создайте предикатную функцию, которая возвращает "tenant_id = sys_context ('tenant_context', 'tenant_id') " для SELECT, INSERT, UPDATE и delete
- добавление политики соотвествующий через dbms_rls, чтобы зарегистрировать функцию сказуемого
Это работает как шарм, не касаясь существующего приложения для выбора, обновления и удаления
Вопрос
При вставке столбец tenant_id не устанавливается, и возникает исключение безопасности. Есть ли какой-нибудь способ это так же гладко, как функция предиката, чтобы всегда устанавливать поля, связанные с безопасностью? Я бы предпочел не добавлять триггеры к 300 + таблицам.