News
DBA-Tipp: READ Objektprivileg für ein echtes Leserecht!

Die Information ist ein schnelllebiges Gut. Jeden Tag werden wir mit hunderten Informationen zugemüllt. Deshalb sind wir bestrebt uns auf das Wesentliche zu konzentrieren und nur substantiell nachhaltige Informationen bereitzustellen.

Icon Unternehmen

Mit der Oracle Datenbank Version 12.1.0.2 hat Oracle endlich ein Objektprivileg eingeführt, welches einem User das Recht gibt, ausschließlich lesend auf Tabellen, View, Materialized Views und Synonyme zuzugreifen.

Doch warum wurde es überhaupt erforderlich und weshalb ist das existierende Objektprivileg SELECT ein heißes Eisen? 

Ein User, welcher das Recht besitzt, kann eine Tabelle oder einzelne Zeilen sperren. Dies hat zur Folge, dass andere User keine DML Operationen auf die gesperrten Objekte ausführen können. Damit kann ein User, welcher eigentlich nur lesend zugreifen soll, eine Anwendung komplett lahmlegen.

Nachfolgend ein Beispiel mit dem SELECT Privileg:

Es werden zwei User angelegt. Einen User scott mit der Tabelle emp und einen read-only User aspicon_read, welcher das SELECT Recht auf die Tabelle scott.emp erhält.

SQL> CREATE USER aspicon_read IDENTIFIED BY aspicon;

User created.

SQL> GRANT CONNECT TO aspicon_read;

Grant succeeded.

SQL> GRANT READ ON scott.emp TO aspicon_read;

Grant succeeded.

In der ersten Session wird ein SELECT FOR UPDATE mit dem User aspicon_read durchgeführt.

SQL> CONN aspicon_read/aspicon
Connected.
SQL> SELECT * FROM scott.emp for update;

In der zweiten Session bleibt ein Update des Users scott auf die Tabelle emp stehen. Es wird auf die Auflösung des Locks gewartet.

SQL> CONN scott/tiger
Connected.
SQL> UPDATE emp SET sal=2000 WHERE ENAME='TURNER';

--> Das ROLLBACK der ersten Session führt zur Ausführung des Updates der zweiten Session.

1 row updated.

Erst nach einem Commit oder Rollback der aspicon_read Session wird das Update des Users scott ausgeführt. Wir sehen also, dass es mit dem SELECT Objektprivileg möglich ist, einen Anwendungsuser zu blockieren.

Als Nächstes schauen wir uns das Verhalten mit dem READ Objektprivileg in einer 12.1.0.2 Datenbank an. Es werden wieder beide User angelegt. Der aspicon_read User bekommt diesmal aber das READ Recht auf die Tabelle scott.emp.

SQL> GRANT READ ON scott.emp TO aspicon_read;

Grant succeeded.

Ein SELECT FOR UPDATE und ein LOCK TABLE schlagen jetzt mit unzureichenden Rechten fehl.

SQL> CONN aspicon_read/aspicon@pdb1
Connected.

SQL> SELECT * FROM scott.emp for update;
SELECT * FROM scott.emp for update
                    *
ERROR at line 1:
ORA-01031: insufficient privileges

SQL>  LOCK TABLE scott.emp IN  EXCLUSIVE MODE;
LOCK TABLE scott.emp IN  EXCLUSIVE MODE
                  *
ERROR at line 1:
ORA-01031: insufficient privileges

SQL>  SELECT * FROM scott.emp ;

....
14 rows selected.

Zuletzt sei noch erwähnt, dass es auch ein Systemprivileg READ ANY TABLE gibt. Dieses Privileg ermöglicht dem User einen Zugriff auf alle Tabellen, View, Materialized Views und Synonyme aller Schemata der Datenbank.