=====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.