Privilegi su Oggetti

S i n t a s s i
GRANT <privileges> ON <object> TO <user> [WITH GRANT OPTION];

Di seguito i privilegi:
SELECT
INSERT
UPDATE
DELETE
REFERENCES (abilita la creazione di constraint su una tabella)
ALTER (abilita l'esecuzione di ALTER TABLE su una tabella)
INDEX
ALL (tutti i privilegi di prima)

L'opzione WITH GRANT OPTION permette di estendere ad una altro utente i privilegi ricevuti.


E s e m p i  o
HR concede i privilegi di select di una tabella a SH con l'opzione "with grant option" e SH estende gli stessi privilegi a OE.

Apriamo 3 terminali.

Terminale 1: ci colleghiamo come HR e diamo la seguente grant.
SQL> conn hr/<password>
Connected.
SQL> GRANT select ON hr.employees TO SH WITH GRANT OPTION;
Grant succeeded.

Terminale 2:  ci colleghiamo come SH
SQL> show user;
USER is "SH"
SQL> select count(*) from employees;
 COUNT(*)
----------
       107


Terminale 3: ci colleghiamo come OE ed interroghiamo la tabella employees.
SQL> show user
USER is "OE"
SQL> select count(*) from hr.employees;
ERROR at line 1:
ORA-00942: table or view does not exist


Terminale 2: diamo a OE le grant di select sulla tabella employees.
SQL> GRANT select ON hr.employees TO OE;
Grant succeeded.
Terminale 3

Terminale 3: anche OE vede la suddetta tabella.
SQL> select count(*) from hr.employees;
  COUNT(*)
----------
       107


S i n t a s s i
REVOKE <privileges> ON <object> FROM <user>;

Un utente non può revocare privilegi che non ha concesso.
HR non  può revocare i privilegi di OE.

SQL> REVOKE select ON employees FROM OE;

Errore SQL: ORA-01927: l'utente non può revocare (REVOKE) privilegi che non ha concesso
01927. 00000 -  "cannot REVOKE privileges you did not grant"
*Cause:    You can only revoke privileges you granted.
*Action:   Don't revoke these privileges.


HR può revocare i privilegi concessi a SH.

SQL> 
REVOKE select ON employees FROM SH;
revoke succeeded.

Revocando i privilegi a SH vengono revocati i privilegi anche a OE.



Se un utente A vuole fornire a tutti gli utenti le grant di select sulla sua tabella "prova" deve eseguire il comando seguente:
GRANT select ON prova TO PUBLIC;

Non è possibile eseguire grant su più oggetti contemporaneamente, ma occorre eseguire due comandi separati. 
Ad esempio la seguente istruzione eseguita dall'user HR va in errore:
GRANT ALL ON hr.countires, hr.locations TO SH;


USER_TAB_PRIVS_MADE o USER_COL_PRIVS_MADE o DBA_TAB_PRIVS o USER_TAB_PRIVS_RECD USER_COL_PRIVS_RECD
sono viste del dizionario dati che visualizza per ogni user i privilegi concessi, compresi gli oggetti e le user a cui sono state assegnate.

Grantee= beneficiario cioè il nome dell’utente a cui è stato dato la grant
Grantor=  proprietario cioè il nome dell’utente che ha concesso le grant

Grant di esecuzione di un package, procedure o funzione

GRANT EXECUTE ON   <owner>.<procedura|funzione|package> TO users;


Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database