Accès aux objets

Implicitement le créateur d’un objet (TABLE, VUE , INDEX, etc.) est son propriétaire, et possède tous les droits sur le contenu et le contenant : consultation, mises à jour, insertion , suppression des liognes. Mais aussi modification et suppression de la structure.

En supposant qu’un user ait le droit de créer une table, implicitement il peut faire toutes les opérations suivantes :

SQL> CREATE TABLE test (n integer);
– on fait des modifs
SQL> INSERT INTO test VALUES(1);
SQL> UPDATE test SET n=2;
SQL> COMMIT;
SQL> DELETE FROM test; — on vide la table
–  on modifie la structure
SQL> ALTER TABLE test ADD (c char(1));
– et finalement on supprime structure et contenu eventuel
SQL> DROP TABLE test;

GRANT et REVOKE permettent respectivement de donner ou de supprimer les droits explicites d’accès en lecture ou mise à jour à un utilisateur particulier, pour un objet particulier.
C’est en général le propriétaire de l’objet qui peut donner des droits d’accès à un autrer utilisateur.
Sinon c’est le DBA (qui a tous les drorts)i

exemples:

SQL> GRANT SELECT ON TAB_CLIENTS TO MARTIN
SQL> GRANT UPDATE, INSERT ON TAB_CLIENTS TO DUPONT

Un utilisateur non propriétaire peut donner des droits sur un objet ne lui appartenant pas : le DBA bien sûr, mais aussi un utilisateur qui a recu des droits et le droit de transferer ce droit (GRANT OPTION)

exemple :

SQL> connect DBA1/DBA1
SQL> GRANT SELECT ON scott.emp TO martin;
SQL> GRANT SELECT, UPDATE, INSERT ON scott.emp TO dupont WITH GRANT OPTION;
SQL> CONNECT dupont/dupont
SQL> GRANT UPDATE ON scott.emp TO martin;

note : ‘GRANT OPTION’ est à utiliser avec parcimonie…

Le type de privilège dépend évidemment de l’objet sur lequel il s’applique. Ceci est résumé dans le tableau suivant :

TABLE	VUE	VUE MAT.	SEQUENCE	PROCEDURE
ALTER 			X				X
DELETE 			X	X	X
EXECUTE 								X
INDEX 			X
INSERT 			X	X	X
REFERENCES (1) 		X	X
SELECT 			X	X	X		X
UPDATE			X	X	X
ON COMMIT REFRESH	X
QUERY REWRITE		X

(1) possibilité de créer une clé étrangère sur la table

Une erreur très répandue consiste à référencer un objet (dont on n’est pas proprétaire), sur lequel on a des droits et qu’on oublie de préfixer…

SQL> SELECT COUNT(*)  from EMP
‘ Table or view doesn’t exists ‘ !!!
– alors que
SQL> SELECT * FROM SCOTT.EMP
–  donne un résultat !!!!

Le cas particulier des droits sur les programmes stockés (packages procédures et fonctions )

Pour exécuter une procédure il faut le droit …EXECUTE PROCEDURE.
Jusque la ca va.
Mais pour les objets sous-jacents à la procédure, Il y a 2 types de droits :
- en tant que créateur de la procédure ( DEFINER’s RIGHT)
- en tant qu’exécuteur de la procédure ( INVOKER’S RIGHT)

Dans les cas simples un utilisateur est propriétaire des tables et des procédures dans le même schéma et par défaut il execute la procédure en tant que créateur et a donc forcément les droits sur les objets du même schéma.

Pour les packages du dictionnaire par contre qui appartiennent à SYS il serait délicat de les exécuter en tant que …SYS, ils sont donc créés avec ‘INVOKER’s RIGHT’

exemple de procédure

SQL> -- c'est lemot réservé AUTHID qui définit les droits 'executeur'
SQL>create or replace procedure TEST
authid current_user is
begin
...