===== Oracle - Über Views Zugriffsrechte auf Tabellen steuern- Problem ORA-01720: grant option does not exist for ====
**Aufgabe**:
Über eine View einen dritten Daten zur Verfügung stellen, ohne Leserechte auf die eigentliche Basis Tabelle.
{{ :prog:oracle_view_select_rights.png?100 | Mit Views Rechte kapslen}}
Wir wollen erreichen, das DB Schema C nur die View in B lesen kann aber dafür KEINE Rechte auf die Basis Tabelle A benötigt!
Granted der User A nur das Select Recht ganz normal an B und granted der User B das select Recht an der View an C funktioniert das nicht, da B das Leserecht auf A nicht weitergeben kann (ORA-01720: grant option does not exist for) !
Dazu muss A dem User B das select Recht mit "with grant option" granten, ansonsten kann der User B das Lese Rechte auf C nicht weitergeben!
**Vorteil:**
Nun kann der User C die Daten NUR über die View B lesen, in dieser View können wir z.b. die Daten dann noch weiter einschränken um zu verhindern, das C alles in A lesen kann. Stichwort Mandanden Fähigkeit !
=== Test Beispiel ===
Die User anlegen:
--A
create user A identified by A;
grant connect to A;
grant create table to A;
grant unlimited tablespace to A;
--B
create user B identified by B;
grant connect to B;
grant create View to B;
--C
create user C identified by C;
grant connect to C;
Testcase 1
User A:
connect a/A
create table T as select * from all_objects;
grant select on T to B;
select count(*) from b.v_t;
COUNT(*)
---------
57357
User B:
connect b/B
create or replace view v_t as select * from A.t where owner='SYS';
grant select on v_t to c;
ERROR at line 1:
ORA-01720: grant option does not exist for 'A.T'
connect a/A
grant select on T to B with grant option;
connect b/B
grant select on v_t to c;
User C:
connect c/C
select count(*) from b.v_t;
COUNT(*)
---------
39401
select count(*) from a.t;
ERROR at line 1:
ORA-00942: table or view does not exist
Damit haben wir den User C über die View fest eingeschränkt, er kann nur Daten lesen die ihm das Schema B zur Verfügung stellt.
----
----
==== Test über 2 Ebenen ====
Geht da auch über nur zwei Ebenen?
Das ganze funktioniert auch über zwei Ebenen, A hat eine Tabelle TT und legt eine View v_TT mit einem Filter Kriterium an. Die Rechte werden an den User B nur auf die View V_TT vergeben, der User B hat keine Rechte auf die Basis Tabelle TT!. Der User B kann nun NUR die Daten über die View lesen!
Übersicht:
{{ :prog:oracle_view_select_rights_v2.png |}}
Test Case:
connect / as sysdba
grant create view to A
connect a/A
create table tt as select * from all_objects;
create or replace view v_tt as select * from TT where owner='SYS';
grant select on v_tt to B;
connect b/B
select count(*) from a.v_tt;
COUNT(*)
----------
39401
SQL> select count(*) from a.TT;
select count(*) from a.TT
*
ERROR at line 1:
ORA-00942: table or view does not exist
In plsql verwenden funktioniert dann auch
connect b/B
SQL> declare
2 v_count pls_integer;
3 begin
4 select count(*) into v_count from a.v_tt;
5 end;
6 /
PL/SQL procedure successfully completed.
----
====Quellen ====
create view =>
https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/CREATE-VIEW.html#GUID-61D2D2B4-DACC-4C7C-89EB-7E50D9594D30