Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:oracle_rollen

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.

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
dba/oracle_rollen.txt · Zuletzt geändert: 2018/08/07 08:41 von Gunther Pippèrr