Oracle Row Level Security в мультитенантном приложении / значения по умолчанию для новых записей


Задача

Модифицируйте существующее приложение, чтобы использовать мультитенантный подход. Должна быть возможность создавать арендаторов, и каждый сеанс пользователя должен ссылаться только на одного активного арендатора. Каждый клиент должен иметь возможность видеть и обновлять только свой раздел схемы базы данных.

Подход

  • создайте контекст приложения Oracle, содержащий идентификатор клиента
  • добавьте столбец идентификатора арендатора в любую таблицу, которая должна быть scoped
  • создайте предикатную функцию, которая возвращает "tenant_id = sys_context ('tenant_context', 'tenant_id') " для SELECT, INSERT, UPDATE и delete
  • добавление политики соотвествующий через dbms_rls, чтобы зарегистрировать функцию сказуемого

Это работает как шарм, не касаясь существующего приложения для выбора, обновления и удаления

Вопрос

При вставке столбец tenant_id не устанавливается, и возникает исключение безопасности. Есть ли какой-нибудь способ это так же гладко, как функция предиката, чтобы всегда устанавливать поля, связанные с безопасностью? Я бы предпочел не добавлять триггеры к 300 + таблицам.

1 3

1 ответ:

Иногда вопрос дает ответ. Я не знал, что вы можете использовать непостоянные выражения в значениях столбца по умолчанию, поэтому

alter table XXX
add column tenant_id default sys_context('tenant_context', 'tenant_id');

Фактически решает мою проблему.