Seit Oracle 8i
In Arbeit
Mit Application Context and Fine-Grained Access Control kann der Zugriff auf Daten innerhalb einer Tabelle sehr gut eingeschränkt werden.
Problem: Über normale Rechte kann das Lesen auf einer Tabelle nur auf alles oder nichts gesetzt werden
Rechte auf Zeilen können über die Anwendung geprüft werden, aber die Anwendung kann mit SQL*Plus umgangen werden Mit Views sind nur bedingte Einschränkungen möglich und nur schwer zu warten bei sehr vielen unterschiedlichen Berechtigungen
Lösung: Virtual Private Database Bei jedem Zugriff auf eine Tabelle wird zuvor eine versteckte Funktion ausgewertet, die das SQL Statement entsprechend einschränkt
Eine Funktion wird einer Tabelle zugeordnet
Beim Parsen eines SQL-Statements wird das Ergebnis der Funktion in die Where-Bedingung mit eingearbeitet.
Beispiel: (Angestellter darf nur seinen Datensatz sehen)
Funktion erzeugt Prädikat:
empno=(select empno from emp where ename = sys_context('userenv','session_user')
Angestellter sucht mit select * from emp
Automatisch wird das SQL-Statement erweitert um:
SELECT * FROM emp WHERE empno=(SELECT empno FROM emp WHERE ename = sys_context('userenv','session_user')
Dazu den Application-Context mit sys_context benutzerdefiniert erweitern.
Zugriff auf eine Tabelle mit RLS
SELECT COUNT(*) FROM personen;
Überprüfen der verwendeten Policie akutell in dieser Session
SELECT * FROM V$VPD_POLICY; ADDRESS|PARADDR|SQL_HASH|SQL_ID|CHILD_NUMBER|OBJECT_OWNER|OBJECT_NAME|POLICY_GROUP|POLICY|POLICY_FUNCTION_OWNER|PREDICATE -------------------------------------------------------------------------------------------------------------------------- 0000000075443B20|00000000792EAF18|2338103776|0ur9ps25pt8g0|0|INFO|PERSONEN|SYS_DEFAULT|PERSONEN_ZUGRIFFSKONTROLLE|INFO|1=1
Oracle
Web:
APEX: