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

Задача

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

подход

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

Это работает как брелок, не касаясь существующего приложения для SELECT, UPDATE и DELETE

Вопрос

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

1 Ответ

3 голосов
/ 14 февраля 2010

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

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

на самом деле решает мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...