DBAtlas · Атлас эксплуатации баз данных

Добавить политику доступа на уровне строк через 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) кэширует предикат и возвращает неверные результаты.

Открыть в DBAtlas →

Связанные материалы