Il permesso, come noto, rappresenta la capacità di compiere un'azione. In Oracle i permessi sono chiamati privilegi e consentono di accedere ad oggetti logici, come le tabelle, posseduti da altri utenti del database, di creare oggetti o di eseguire particolari attività amministrative.
Queste sono solamente alcune delle possibili azioni che in realtà sono davvero numerose. In questa lezione tratteremo due categorie di privilegi Oracle:
- Privilegi sugli oggetti - intesi come l'insieme di operazioni che è possibile compiere su un particolare schema. Ricordiamo che lo schema è, in realtà, un'utente che possiede oggetti;
- Privilegi di sistema - consentono di eseguire operazioni di sistema, come la creazione di tabelle, di utenti o di avere la possibilità di connettersi ad un database.
I privilegi sugli oggetti
Tratteremo solamente i seguenti privilegi: ALTER
, SELECT
, DELETE
, INSERT
e UPDATE
. L'oggetto su cui agiscono è la tabella ma questi possono anche operare su funzioni, procedure, sequenze, viste, ecc.
L'utente amministrativo SYSTEM
è l'account abilitato alla concessione dei privilegi sugli oggetti ad un altro utente ma, in realtà, la concessione può essere anche data dal proprietario dell'oggetto. Negli esempi che seguiranno le concessioni e le revoche dei privilegi sono state eseguite usufruendo dell'utente SYSTEM
.
Per concedere ad un utente un privilegio sugli oggetti utilizziamo il comando GRANT
.
Sintassi di GRANT
GRANT <privilegio> ON <schema>.<oggetto> TO <utente>;
Per revocare, invece, un privilegio sugli oggetti già concesso ad un utente utilizziamo il comando REVOKE
.
Sintassi di REVOKE
REVOKE <privilegio> ON <schema>.<oggetto> FROM <utente>;
Il privilegio ALTER
Concesso su un oggetto tabella, permette all'utente a cui è affidato di modificare la struttura di questa tabella, anche se di proprietà di un altro utente. In particolare permette di:
- aggiungere nuove colonne alla tabella;
- cancellare colonne dalla tabella;
- modificare il nome della tabella;
- modificare il datatype di colonna.
Concediamo all'utente "sampras" il privilegio di alterare la tabella impiegati, di proprietà dell'utente "myself".
SQL> GRANT ALTER ON myself.impiegati TO sampras;
Revochiamo adesso il privilegio appena concesso.
SQL> REVOKE ALTER ON myself.impiegati FROM sampras;
Il privilegio SELECT
Consente di eseguire query, interrogazioni, su tabelle o viste (oggetti logici su cui è concesso) che non sono di proprietà dell'utente beneficiario del privilegio. Può persino essere concesso a livello di colonna, al fine di eseguire query solo su alcune colonne e non su tutte quelle che compongono la tabella.
Concediamo all'utente "pierf" il privilegio di eseguire una SELECT
sulla tabella "contatti", di proprietà dell'utente "myself".
Esempio di output su console
SQL> GRANT SELECT ON myself.contatti TO pierf;
Revochiamo adesso il privilegio appena concesso.
SQL> REVOKE SELECT ON myself.contatti FROM pierf;
Il privilegio DELETE
Permette di rimuovere righe da una tabella o da una vista, di proprietà di un altro utente. Per poter effettivamente rimuovere le righe è necessario che all'utente beneficiario del privilegio DELETE
sia concesso anche il privilegio SELECT
sulla stessa tabella.
Concediamo all'utente "noise" il privilegio di cancellare righe dalla tabella "copia_contatti", di proprietà dell'utente "myself".
SQL> GRANT DELETE ON myself.copia_contatti TO noise;
Revochiamo adesso il privilegio appena concesso.
SQL> REVOKE DELETE ON myself.copia_contatti FROM noise;
Il privilegio INSERT
Permette di inserire nuove righe in una tabella posseduta da un altro utente. Questo privilegio può essere concesso anche a livello di colonna per consentire, all'utente beneficiario, di inserire dati solo nelle colonne specificate nella GRANT
e non su tutte quelle che compongono la tabella.
Concediamo all'utente "sampras" il privilegio di inserire nuove righe nella tabella contatti, di proprietà dell'utente "myself".
SQL> GRANT INSERT ON myself.contatti TO sampras;
Revochiamo adesso il privilegio appena concesso.
SQL> REVOKE INSERT ON myself.contatti FROM sampras;
Il privilegio UPDATE
Permette di modificare i dati contenuti nella tabella specificata, di proprietà di un altro utente. Può essere concesso sia sull'intera tabella che sulla singola colonna, al fine di limitare la modifica dei dati solo su alcune colonne e non su tutte.
Concediamo all'utente noise il privilegio di aggiornare esclusivamente le colonne ID_Impiegato
e Nominativo
della tabella "impiegati", di proprietà dell'utente "myself".
SQL> GRANT UPDATE (ID_Impiegato, Nominativo) ON myself.impiegati TO noise;
Revochiamo il permesso all'utente noise. Il privilegio concesso solo su alcune colonne viene invece revocato per l'intera tabella.
SQL> REVOKE UPDATE ON myself.impiegati FROM noise;