prog:oracle_view_rechte
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
prog:oracle_view_rechte [2018/06/15 08:20] – [Test über 2 Ebenen] gpipperr | prog:oracle_view_rechte [2018/11/19 11:58] (aktuell) – gpipperr | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ===== Oracle - Über Views Zugriffsrechte auf Tabellen steuern- Problem ORA-01720: grant option does not exist for ==== | ||
+ | |||
+ | |||
+ | <fc # | ||
+ | |||
+ | Über eine View einen dritten Daten zur Verfügung stellen, ohne Leserechte auf die eigentliche Basis Tabelle. | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | 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" | ||
+ | |||
+ | <fc # | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code sql> | ||
+ | --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: | ||
+ | <code sql> | ||
+ | connect a/A | ||
+ | |||
+ | create table T as select * from all_objects; | ||
+ | grant select on T to B; | ||
+ | |||
+ | select count(*) from b.v_t; | ||
+ | |||
+ | | ||
+ | --------- | ||
+ | 57357 | ||
+ | | ||
+ | </ | ||
+ | |||
+ | User B: | ||
+ | <code sql> | ||
+ | connect b/B | ||
+ | create or replace view v_t as select * from A.t where owner=' | ||
+ | grant select on v_t to c; | ||
+ | |||
+ | ERROR at line 1: | ||
+ | ORA-01720: grant option does not exist for ' | ||
+ | |||
+ | connect a/A | ||
+ | grant select on T to B with grant option; | ||
+ | |||
+ | connect b/B | ||
+ | grant select on v_t to c; | ||
+ | </ | ||
+ | |||
+ | User C: | ||
+ | <code sql> | ||
+ | connect c/C | ||
+ | select count(*) from b.v_t; | ||
+ | |||
+ | | ||
+ | --------- | ||
+ | 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, | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== 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: | ||
+ | {{ : | ||
+ | |||
+ | |||
+ | Test Case: | ||
+ | <code sql> | ||
+ | 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=' | ||
+ | |||
+ | 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 | ||
+ | <code sql> | ||
+ | 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:// | ||
+ | |||
prog/oracle_view_rechte.txt · Zuletzt geändert: 2018/11/19 11:58 von gpipperr