Добавить политику доступа на уровне строк через VPD (DBMS_RLS)
OracleБезопасностьКоманда
-- 1) Policy function returning the predicate:
CREATE OR REPLACE FUNCTION customer_app.customer_vpd_fn (
p_schema IN VARCHAR2,
p_object IN VARCHAR2
) RETURN VARCHAR2
AS
BEGIN
-- The schema owner sees all rows (NULL = no restriction)
IF SYS_CONTEXT('USERENV', 'SESSION_USER') = 'CUSTOMER_APP' THEN
RETURN NULL;
END IF;
-- Other users see only their own city
RETURN 'city = SYS_CONTEXT(''USERENV'', ''CLIENT_IDENTIFIER'')';
END;
/
-- 2) Attach the policy to the table:
BEGIN
DBMS_RLS.ADD_POLICY(
object_schema => 'CUSTOMER_APP',
object_name => 'CUSTOMER',
policy_name => 'CUSTOMER_CITY_VPD',
function_schema => 'CUSTOMER_APP',
policy_function => 'CUSTOMER_VPD_FN',
statement_types => 'SELECT, UPDATE, DELETE',
update_check => TRUE,
policy_type => DBMS_RLS.CONTEXT_SENSITIVE);
END;
/
-- 3) Check:
SELECT object_owner, object_name, policy_name, function,
sel, upd, del, chk_option, enable, policy_type
FROM dba_policies WHERE object_owner = 'CUSTOMER_APP';
-- Test (as the application user): EXEC DBMS_SESSION.SET_IDENTIFIER('Ankara');
-- 4) Temporarily disable / drop:
EXEC DBMS_RLS.ENABLE_POLICY('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_CITY_VPD', FALSE);
EXEC DBMS_RLS.DROP_POLICY('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_CITY_VPD');Что делает
Virtual Private Database автоматически добавляет предикат WHERE, возвращаемый функцией политики, к каждому SQL против таблицы, поэтому пользователи одной и той же таблицы видят/изменяют только разрешённые им строки. update_check=>TRUE не позволяет пользователю изменить строку на значение, которое он не смог бы увидеть.
Когда использовать
В multi-tenant-приложениях, для изоляции данных по регионам/филиалам и чтобы добавить защиту строк без изменения кода приложения.
Внимание
Входит в Enterprise Edition, дополнительная лицензия не нужна. CLIENT_IDENTIFIER клиент может задать произвольно; в production используйте контекст приложения, устанавливаемый доверенным пакетом (CREATE CONTEXT ... USING). SYS и пользователи с EXEMPT ACCESS POLICY обходят политику; экспорт Data Pump без этой привилегии молча выгружает неполные данные. Ошибка в функции блокирует любой доступ с ORA-28112. Неверный policy_type (например, STATIC) кэширует предикат и возвращает неверные результаты.
Связанные материалы
- Создать и открыть keystore TDE, задать мастер-ключ и сделать бэкап (19c+)
- Зашифровать табличные пространства через TDE (новые и существующие, онлайн/офлайн)
- Создать политику Unified Auditing, включить её с условием, просмотреть записи, удалить
- Создать профиль с политикой паролей и назначить его пользователям
- Найти неиспользуемые привилегии с помощью privilege analysis