Rollen in der Oracle Datenbank - Der Unterschied zwischen der SELECT_CATALOG_ROLE Role zu dem SELECT ANY DICTIONARY Recht
Soll in der Datenbank ein User das Oracle Data Dictionary ohne DBA Rechte lesen können, können die folgenden Rechte vergeben werden:
- Rolle SELECT_CATALOG_ROLE
oder
- System Privileg SELECT ANY DICTIONARY
Was ist aber dabei der Unterschied?
SELECT_CATALOG_ROLE
Mit der Rolle SELECT_CATALOG_ROLE ist das Leserecht auf ca. 3631 Tabellen (Oracle 12c) alle DB System User (wie XDB) vergeben.
Zuweisen mit:
GRANT SELECT_CATALOG_ROLE TO gpi;
SELECT ANY DICTIONARY
SELECT ANY DICTIONARY ist ein System Privilege um DD Tabellen des SYS Users lesen zu können.
Welche Tabellen das sind, ist im Oracle Core im Code direkt festgelegt und kann in der Datenbank nicht abgefragt werden.
Zuweisen mit:
GRANT SELECT ANY DICTIONARY TO gpi;
Unterschied
Sichtbar wird der Unterschied zum Beispiel bei PL/SQL Proceduren.
In PLSQL müssen dem User die Rechte direkt gehöhren, eine Rolle für die Rechte ist nicht ausreichend.
Beispiel:
Test mit user und erteilten System Privilege SELECT ANY DICTIONARY
REVOKE SELECT_CATALOG_ROLE FROM gpi; GRANT SELECT ANY DICTIONARY TO gpi; CONNECT gpi/gpi variable num NUMBER BEGIN SELECT COUNT(*) INTO :num FROM v$session; END; / print num ---- 38 PL/SQL-Prozedur erfolgreich abgeschlossen. CREATE OR REPLACE FUNCTION p_test RETURN NUMBER AS v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM v$session; RETURN v_count; END; / Prozedur wurde erstellt. -- Arufrufen: SELECT p_test FROM dual; P_TEST ------------ 39
Alles funktioniert wie erwartet.
Test mit der Rolle SELECT_CATALOG_ROLE
CONNECT / AS sysdba REVOKE SELECT ANY DICTIONARY FROM gpi; GRANT SELECT_CATALOG_ROLE TO gpi; CONNECT gpi/gpi variable num NUMBER BEGIN SELECT COUNT(*) INTO :num FROM v$session; END; / print num ---- 38 PL/SQL-Prozedur erfolgreich abgeschlossen. CREATE OR REPLACE FUNCTION p_test RETURN NUMBER AS v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM v$session; RETURN v_count; END; / Warnung: Prozedur wurde mit Kompilierungsfehlern erstellt. 5/35 PL/SQL: ORA-00942: Tabelle oder VIEW nicht vorhanden
Nun kann das Stück PL/SQL Code nicht mehr übersetzt werden, da das direkte Recht auf die Tabelle für eine eigene DDL Operation fehlt.
Neues Verhalten mit 11.2.0.4 und 12c
Seit Oracle Database 12c und 11.2.0.4 kann mit SELECT ANY DICTIONARY keine USER$, ENC$ and DEFAULT_PWD$, LINK$, USER_HISTORY$, CDB_LOCAL_ADMINAUTH$, and XS$VERIFIERS Tabelle mehr gelesen werden, seit 10.1 die LINK$ Tabelle.