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