Zugriffs-Policy auf Zeilenebene mit VPD hinzufügen (DBMS_RLS)
OracleSicherheitBefehl
-- 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');Was es tut
Virtual Private Database hängt das von der Policy-Funktion gelieferte WHERE-Prädikat automatisch an jede SQL auf die Tabelle an, sodass Benutzer derselben Tabelle nur die Zeilen sehen/ändern, zu denen sie berechtigt sind. update_check=>TRUE verhindert, dass ein Benutzer eine Zeile auf einen Wert ändert, den er nicht sehen dürfte.
Wann einsetzen
In mandantenfähigen Anwendungen, für Datentrennung nach Region/Filiale und um Zeilensicherheit hinzuzufügen, ohne den Anwendungscode anzufassen.
Vorsicht
In der Enterprise Edition enthalten, keine Zusatzlizenz. CLIENT_IDENTIFIER kann der Client frei setzen; nutze in der Produktion einen Application Context, der von einem vertrauenswürdigen Package gesetzt wird (CREATE CONTEXT ... USING). SYS und Benutzer mit EXEMPT ACCESS POLICY umgehen die Policy; Data-Pump-Exporte ohne dieses Privileg exportieren stillschweigend nur einen Teil der Daten. Ein Fehler in der Funktion blockiert jeden Zugriff mit ORA-28112. Ein falscher policy_type (z. B. STATIC) cacht das Prädikat und liefert falsche Ergebnisse.
Verwandte Einträge
- TDE-Keystore anlegen, öffnen, Master Key setzen und sichern (ab 19c)
- Tablespaces mit TDE verschlüsseln (neu und bestehend, online/offline)
- Unified-Auditing-Policy anlegen, bedingt aktivieren, Einträge prüfen und entfernen
- Profil für Passwortrichtlinien anlegen und Benutzern zuweisen
- Ungenutzte Privilegien mit Privilege Analysis finden